Free and open source ticket system written in python

📦 NEW: Add FileAttachment model

+84 -3
+1 -1
.gitignore
··· 156 156 157 157 static/admin 158 158 static/colorfield 159 - media/profile_pics 159 + media/*
+2 -1
ticketing/admin.py
··· 1 1 from django.contrib import admin 2 - from .models import Category, Ticket, Comment, Template, Team 2 + from .models import Category, Ticket, Comment, Template, Team, FileAttachment 3 3 4 4 # Register your models here. 5 5 admin.site.register(Category) ··· 7 7 admin.site.register(Comment) 8 8 admin.site.register(Template) 9 9 admin.site.register(Team) 10 + admin.site.register(FileAttachment)
+42
ticketing/migrations/0010_fileattachment.py
··· 1 + # Generated by Django 5.0.3 on 2024-03-10 23:30 2 + 3 + import django.db.models.deletion 4 + from django.db import migrations, models 5 + 6 + 7 + class Migration(migrations.Migration): 8 + 9 + dependencies = [ 10 + ("ticketing", "0009_ticket_follow_up_to_alter_category_team"), 11 + ] 12 + 13 + operations = [ 14 + migrations.CreateModel( 15 + name="FileAttachment", 16 + fields=[ 17 + ( 18 + "id", 19 + models.BigAutoField( 20 + auto_created=True, 21 + primary_key=True, 22 + serialize=False, 23 + verbose_name="ID", 24 + ), 25 + ), 26 + ( 27 + "file", 28 + models.FileField( 29 + upload_to="attachments/<ticketing.models.file_prefix object at 0x1043b6ed0>" 30 + ), 31 + ), 32 + ("uploaded_at", models.DateTimeField(auto_now_add=True)), 33 + ( 34 + "ticket", 35 + models.ForeignKey( 36 + on_delete=django.db.models.deletion.CASCADE, 37 + to="ticketing.ticket", 38 + ), 39 + ), 40 + ], 41 + ), 42 + ]
+21
ticketing/migrations/0011_alter_fileattachment_file.py
··· 1 + # Generated by Django 5.0.3 on 2024-03-11 00:06 2 + 3 + import ticketing.models 4 + from django.db import migrations, models 5 + 6 + 7 + class Migration(migrations.Migration): 8 + 9 + dependencies = [ 10 + ("ticketing", "0010_fileattachment"), 11 + ] 12 + 13 + operations = [ 14 + migrations.AlterField( 15 + model_name="fileattachment", 16 + name="file", 17 + field=models.FileField( 18 + max_length=255, upload_to=ticketing.models.ticket_directory_path 19 + ), 20 + ), 21 + ]
+18 -1
ticketing/models.py
··· 4 4 from django.utils.translation import gettext_lazy as _ 5 5 from django.db.models.signals import post_save 6 6 from django.dispatch import receiver 7 + from uuid import uuid4 8 + 9 + 10 + def ticket_directory_path(instance, filename): 11 + """ file will be uploaded to MEDIA_ROOT/ticket_<id>/<filename> """ 12 + ext = filename.split('.')[-1] 13 + return "attachments/ticket_{0}/{1}.{2}".format(instance.ticket.id, uuid4(), ext) 7 14 8 15 9 16 class Team(models.Model): ··· 18 25 class Category(models.Model): 19 26 name = models.CharField(max_length=200) 20 27 team = models.ForeignKey( 21 - Team, on_delete=models.CASCADE, null=True, blank=True, help_text="If a team is selected, new tickets will automatically assigned to this team.") 28 + Team, on_delete=models.CASCADE, null=True, blank=True, help_text=_("If a team is selected, new tickets will automatically assigned to this team.")) 22 29 23 30 def __str__(self): 24 31 return self.name ··· 102 109 103 110 def __str__(self): 104 111 return f'Comment by {self.user.username} on {self.ticket.title}' 112 + 113 + 114 + class FileAttachment(models.Model): 115 + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE) 116 + file = models.FileField( 117 + upload_to=ticket_directory_path, max_length=255) 118 + uploaded_at = models.DateTimeField(auto_now_add=True) 119 + 120 + def __str__(self): 121 + return f'{_('Attachment for')} {self.ticket.title}' 105 122 106 123 107 124 class Template(models.Model):