Объединение нескольких представлений с несколькими пользователями в один html-файл в django

Правильно,

- У меня есть проект с многопользовательским логином (разработчик и менеджер проекта). - Менеджер проекта открывает тикет Разработчик может принять тикет и завершить тикет - Менеджер проекта может закрыть билет после того, как разработчик отметит его завершение

Я реализовал представления на основе функций и в моей реализации много повторяющегося кода У меня есть 8 html страниц для разработчика и менеджера, приборная панель для открытых, принятых, завершенных и закрытых билетов Мне нужно, чтобы представления на основе функций были написаны в общих представлениях listview и отображали содержимое в соответствии с пользователем, вошедшим в систему

models.py

`

class User(AbstractUser):
    is_developer = models.BooleanField(default=False)
    is_manager = models.BooleanField(default=False)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)


class Ticket(models.Model):
    ticket_title = models.CharField(unique=True,max_length=200)
    ticket_description = models.TextField()
    created_by = models.ForeignKey(User,related_name = 'created_by',blank=True,null=True,on_delete=models.CASCADE)

    STATUS_CHOICES = (
        ('Opened','Opened'),
        ('Accepted','Accepted'),
        ('Completed','Completed'),
        ('Closed','Closed')
    )

    status = models.CharField('Status',choices=STATUS_CHOICES,max_length = 100,blank=True,null=True)

    closed_date = models.DateTimeField(blank=True,null=True)
    completed_date = models.DateTimeField(blank=True,null=True)
    accepted_date = models.DateTimeField(blank=True,null=True)
    opened_date = models.DateTimeField(blank=True,null=True)
    

    accepted_by = models.ForeignKey(User,related_name='assigned_to',on_delete=models.CASCADE,blank=True,null=True)

    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

`

views.py

def manager_login(request):
    current = User.objects.filter(is_manager = True)
    
    if request.method == 'POST':
        pm_form = AuthenticationForm(data=request.POST)

        if pm_form.is_valid():
            username = pm_form.cleaned_data.get('username')
            password = pm_form.cleaned_data.get('password')
            user = authenticate(username=username,password=password)

            if user is not None:
                if user in current:
                    login(request,user)
                    return redirect(reverse('pm_dashboard'))
            else:
                messages.error(request,"Invalid Username or Password")

        else:
                messages.error(request,"Invalid Username or Password")
    return render(request, 'app/pm_login.html',context={'form':AuthenticationForm(),})


@login_required
def ticket_create_view(request):

    if request.POST:
        form = TicketCreateForm(request.POST)

        if form.is_valid():
            obj = form.save()
            obj.created_by = request.user
            obj.status = "Opened"
            obj.opened_date = datetime.datetime.now()
            obj.save()

            return HttpResponseRedirect(reverse('pm_open_tickets'))

    else:
        form = TicketCreateForm()

    return render(request,'app/create_ticket.html',{'form': form,})




@login_required
def pm_open_tickets_view(request):
    tickets_open = Ticket.objects.filter(status = 'Opened',created_by = request.user) 
    return render(request,'app/pm_open_tickets.html',{"tickets": tickets_open})


@login_required
def pm_accepted_tickets(request):
    ticket_complete = Ticket.objects.filter(status = 'Accepted',created_by = request.user)
    return render(request,'app/pm_accepted_tickets.html',{"tickets": ticket_complete})


@login_required
def pm_completed_tickets(request):
    tickets_completed = Ticket.objects.filter(status = 'Completed',created_by = request.user)
    return render(request,'app/pm_completed_tickets.html',{"tickets": tickets_completed})


@login_required
def pm_close_tickets(request,pk):
    ticket = get_object_or_404(Ticket,id=pk)
    if ticket.status == 'Completed' and ticket.created_by == request.user:
        ticket.status = 'Closed'
        ticket.closed_date = datetime.datetime.now()
        ticket.save()
    return redirect(reverse("pm_completed_tickets_view"))

html

<table  class="table table-bordered">
        <thead>
        <tr>
            <th>ID</th>
            <th>Status</th>
            <th>accepted by</th>
            <th>Title</th>
            <th>Description</th>
             <th>Opened Date</th>
            <th>Accepted Date</th>
            <th>Completed Date</th>
        </tr>
        </thead>

        <tbody>
    {% for ticket in tickets %}
        <tr>
            <td><a href="">{{ ticket.id }}</a></td>
            <td>{{ ticket.status }}</td>
            <td>{{ ticket.accepted_by }}</td>
            <td>{{ ticket.ticket_title }}</td>
            <td>{{ ticket.ticket_description }}</td>
            <td>{{ ticket.opened_date }}</td>
            <td>{{ ticket.accepted_date }}</td>
            <td>{{ ticket.completed_date }}</td>
            <td><a href="{% url 'pm_close_ticket' pk=ticket.id%}">Close</a></td>
        </tr>

Все html с небольшими изменениями в заголовке, как указано

Вернуться на верх