unqiue hologram code
This commit is contained in:
		
							parent
							
								
									328c657e0f
								
							
						
					
					
						commit
						ef0779de6a
					
				
					 5 changed files with 70 additions and 12 deletions
				
			
		| 
						 | 
					@ -12,9 +12,7 @@ class CertificateTemplateAdmin(admin.ModelAdmin):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@admin.register(CertificateInstance)
 | 
					@admin.register(CertificateInstance)
 | 
				
			||||||
class CertificateInstanceAdmin(admin.ModelAdmin):
 | 
					class CertificateInstanceAdmin(admin.ModelAdmin):
 | 
				
			||||||
    list_display = ('process_instance', 'rendered_title', 'issued_at', 'approved')
 | 
					    list_display = ('process_instance', 'rendered_title', 'hologram_code', 'issued_at', 'approved')
 | 
				
			||||||
    list_filter = ('approved', 'issued_at')
 | 
					    list_filter = ('approved', 'issued_at')
 | 
				
			||||||
    search_fields = ('process_instance__code', 'rendered_title')
 | 
					    search_fields = ('process_instance__code', 'rendered_title', 'hologram_code')
 | 
				
			||||||
    autocomplete_fields = ('process_instance', 'template')
 | 
					    autocomplete_fields = ('process_instance', 'template')
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					# Generated by Django 5.2.4 on 2025-10-09 08:26
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.db import migrations, models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Migration(migrations.Migration):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dependencies = [
 | 
				
			||||||
 | 
					        ('certificates', '0002_certificateinstance_hologram_code'),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    operations = [
 | 
				
			||||||
 | 
					        migrations.AlterField(
 | 
				
			||||||
 | 
					            model_name='certificateinstance',
 | 
				
			||||||
 | 
					            name='hologram_code',
 | 
				
			||||||
 | 
					            field=models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='کد یکتا هولوگرام'),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ class CertificateInstance(BaseModel):
 | 
				
			||||||
    issued_at = models.DateField(auto_now_add=True, verbose_name='تاریخ صدور')
 | 
					    issued_at = models.DateField(auto_now_add=True, verbose_name='تاریخ صدور')
 | 
				
			||||||
    approved = models.BooleanField(default=False, verbose_name='تایید شده')
 | 
					    approved = models.BooleanField(default=False, verbose_name='تایید شده')
 | 
				
			||||||
    approved_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ تایید')
 | 
					    approved_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ تایید')
 | 
				
			||||||
    hologram_code = models.CharField(max_length=50, null=True, blank=True, verbose_name='کد یکتا هولوگرام')
 | 
					    hologram_code = models.CharField(max_length=50, null=True, blank=True, verbose_name='کد یکتا هولوگرام', unique=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        verbose_name = 'گواهی'
 | 
					        verbose_name = 'گواهی'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,7 @@ from django.urls import reverse
 | 
				
			||||||
from django.utils import timezone
 | 
					from django.utils import timezone
 | 
				
			||||||
from django.template import Template, Context
 | 
					from django.template import Template, Context
 | 
				
			||||||
from django.utils.safestring import mark_safe
 | 
					from django.utils.safestring import mark_safe
 | 
				
			||||||
 | 
					from django.db import IntegrityError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from processes.models import ProcessInstance, StepInstance
 | 
					from processes.models import ProcessInstance, StepInstance
 | 
				
			||||||
from invoices.models import Invoice
 | 
					from invoices.models import Invoice
 | 
				
			||||||
| 
						 | 
					@ -157,15 +158,56 @@ def certificate_print(request, instance_id):
 | 
				
			||||||
    if request.method == 'POST':
 | 
					    if request.method == 'POST':
 | 
				
			||||||
        # Save/update hologram code then print
 | 
					        # Save/update hologram code then print
 | 
				
			||||||
        code = (request.POST.get('hologram_code') or '').strip()
 | 
					        code = (request.POST.get('hologram_code') or '').strip()
 | 
				
			||||||
        if cert:
 | 
					        
 | 
				
			||||||
            if code:
 | 
					        if not code:
 | 
				
			||||||
 | 
					            messages.error(request, 'کد یکتای هولوگرام الزامی است')
 | 
				
			||||||
 | 
					            # Find certificate step to redirect back
 | 
				
			||||||
 | 
					            certificate_step = instance.process.steps.filter(order=9).first()
 | 
				
			||||||
 | 
					            if certificate_step and instance.current_step:
 | 
				
			||||||
 | 
					                return redirect('processes:step_detail', instance_id=instance.id, step_id=certificate_step.id)
 | 
				
			||||||
 | 
					            return redirect('processes:instance_summary', instance_id=instance.id)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            if cert:
 | 
				
			||||||
 | 
					                # Check if hologram code is already used by another certificate
 | 
				
			||||||
 | 
					                if CertificateInstance.objects.filter(hologram_code=code).exclude(id=cert.id).exists():
 | 
				
			||||||
 | 
					                    messages.error(request, 'این کد هولوگرام قبلاً استفاده شده است. لطفاً کد دیگری وارد کنید')
 | 
				
			||||||
 | 
					                    # Find certificate step to redirect back
 | 
				
			||||||
 | 
					                    certificate_step = instance.process.steps.filter(order=9).first()
 | 
				
			||||||
 | 
					                    if certificate_step and instance.current_step:
 | 
				
			||||||
 | 
					                        return redirect('processes:step_detail', instance_id=instance.id, step_id=certificate_step.id)
 | 
				
			||||||
 | 
					                    return redirect('processes:instance_summary', instance_id=instance.id)
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
                cert.hologram_code = code
 | 
					                cert.hologram_code = code
 | 
				
			||||||
                cert.save(update_fields=['hologram_code'])
 | 
					                cert.save(update_fields=['hologram_code'])
 | 
				
			||||||
        else:
 | 
					            else:
 | 
				
			||||||
            template = CertificateTemplate.objects.filter(is_active=True).order_by('-created').first()
 | 
					                # Check if hologram code is already used
 | 
				
			||||||
            if template:
 | 
					                if CertificateInstance.objects.filter(hologram_code=code).exists():
 | 
				
			||||||
                title, body = _render_template(template, instance)
 | 
					                    messages.error(request, 'این کد هولوگرام قبلاً استفاده شده است. لطفاً کد دیگری وارد کنید')
 | 
				
			||||||
                cert = CertificateInstance.objects.create(process_instance=instance, template=template, rendered_title=title, rendered_body=body, hologram_code=code or None)
 | 
					                    # Find certificate step to redirect back
 | 
				
			||||||
 | 
					                    certificate_step = instance.process.steps.filter(order=9).first()
 | 
				
			||||||
 | 
					                    if certificate_step and instance.current_step:
 | 
				
			||||||
 | 
					                        return redirect('processes:step_detail', instance_id=instance.id, step_id=certificate_step.id)
 | 
				
			||||||
 | 
					                    return redirect('processes:instance_summary', instance_id=instance.id)
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                template = CertificateTemplate.objects.filter(is_active=True).order_by('-created').first()
 | 
				
			||||||
 | 
					                if template:
 | 
				
			||||||
 | 
					                    title, body = _render_template(template, instance)
 | 
				
			||||||
 | 
					                    cert = CertificateInstance.objects.create(
 | 
				
			||||||
 | 
					                        process_instance=instance, 
 | 
				
			||||||
 | 
					                        template=template, 
 | 
				
			||||||
 | 
					                        rendered_title=title, 
 | 
				
			||||||
 | 
					                        rendered_body=body, 
 | 
				
			||||||
 | 
					                        hologram_code=code
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					        except IntegrityError:
 | 
				
			||||||
 | 
					            messages.error(request, 'این کد هولوگرام قبلاً استفاده شده است. لطفاً کد دیگری وارد کنید')
 | 
				
			||||||
 | 
					            # Find certificate step to redirect back
 | 
				
			||||||
 | 
					            certificate_step = instance.process.steps.filter(order=9).first()
 | 
				
			||||||
 | 
					            if certificate_step and instance.current_step:
 | 
				
			||||||
 | 
					                return redirect('processes:step_detail', instance_id=instance.id, step_id=certificate_step.id)
 | 
				
			||||||
 | 
					            return redirect('processes:instance_summary', instance_id=instance.id)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        # proceed to rendering page after saving code
 | 
					        # proceed to rendering page after saving code
 | 
				
			||||||
        return render(request, 'certificates/print.html', {
 | 
					        return render(request, 'certificates/print.html', {
 | 
				
			||||||
            'instance': instance,
 | 
					            'instance': instance,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								db.sqlite3
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								db.sqlite3
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue