Объединение нескольких представлений с несколькими пользователями в один 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 с небольшими изменениями в заголовке, как указано