-
-
Save Kulikovpavel/f00c3787a0794b1dc8fbc338f25521fa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
from datetime import datetime | |
import tempfile | |
from wsgiref.util import FileWrapper | |
from django.conf import settings | |
from django.contrib.auth.decorators import login_required | |
from django.db.models import Sum, Count, Value | |
from django.http import HttpResponse | |
from django.http import HttpResponseBadRequest | |
from django.http import JsonResponse | |
from django.shortcuts import render | |
from django.core.urlresolvers import reverse, reverse_lazy | |
from django.utils.decorators import method_decorator | |
from django.utils.encoding import iri_to_uri | |
from django.views.generic import View | |
from django.views.generic import CreateView | |
from django.views.generic import ListView, DetailView | |
from django import forms | |
from django.views.generic import FormView | |
from docxtpl import DocxTemplate | |
from main.forms import AllRequiredStudentModelForm | |
from main.models import Template, Group, Student, Event, EventRecord, Payment, Instructor | |
def print_template(template: Template, query_group: int, query_students: str) -> HttpResponse: | |
doc = DocxTemplate(os.path.join(settings.MEDIA_ROOT, template.file.name)) | |
context = dict() | |
if query_students: | |
print(query_students) | |
query_list = query_students.split(";") | |
students = Student.objects.filter(pk__in=query_list) | |
students_dict_list = [s.model_to_dict() for s in students] | |
context['students'] = students_dict_list | |
else: | |
group = Group.objects.get(pk=query_group) | |
students_dict_list = [s.model_to_dict() for s in group.students.all()] | |
group_dict = group.model_to_dict() | |
context = group_dict | |
context['students'] = students_dict_list | |
doc.render(context) | |
fp = tempfile.NamedTemporaryFile() | |
doc.save(fp.name) | |
response = HttpResponse(FileWrapper(fp), | |
content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') | |
response['Content-Disposition'] = "attachment; filename=%s-%s.docx" % (iri_to_uri(template.title), datetime.now()) | |
return response | |
class PrintForm(forms.Form): | |
template = forms.ModelChoiceField( | |
label='', | |
queryset=Template.objects.all(), | |
required=False, | |
widget=forms.Select(attrs={'class': 'form-control', 'required': 'required'}), | |
) | |
query_group = forms.IntegerField(widget=forms.HiddenInput, required=False) | |
query_students = forms.CharField(widget=forms.HiddenInput, required=False) | |
class EventRecordForm(forms.Form): | |
event = forms.ModelChoiceField( | |
label='', | |
queryset=Event.objects.all(), | |
required=True, | |
widget=forms.Select(attrs={'class': 'form-control', 'required': 'required'}), | |
) | |
date = forms.DateField(required=True, widget=forms.DateInput(attrs={'type': 'date', 'required': 'required'})) | |
time = forms.TimeField(required=False, widget=forms.DateInput(attrs={'type': 'time'})) | |
student = forms.CharField(widget=forms.HiddenInput, required=False) | |
comment = forms.CharField(required=False, widget=forms.TextInput(attrs={'class': 'form-control'})) | |
class PaymentForm(forms.ModelForm): | |
prefix = 'payment' | |
class Meta: | |
model = Payment | |
fields = ['date', 'student', 'total', 'kassa', 'comment'] | |
widgets = { | |
'date': forms.DateInput(attrs={'type': 'date'}), | |
'student': forms.HiddenInput, | |
'comment': forms.TextInput() | |
} | |
def __init__(self, *args, **kwargs): | |
super().__init__(*args, **kwargs) | |
for field in iter(self.fields): | |
self.fields[field].widget.attrs.update({ | |
'class': 'form-control' | |
}) | |
@method_decorator(login_required, name='dispatch') | |
class GroupList(ListView): | |
model = Group | |
context_object_name = 'groups' | |
@method_decorator(login_required, name='dispatch') | |
class GroupDetail(DetailView): | |
model = Group | |
context_object_name = 'group' | |
def get_context_data(self, **kwargs): | |
context = super(GroupDetail, self).get_context_data(**kwargs) | |
template_form = PrintForm({'query_group': self.object.id}) | |
context['template_form'] = template_form | |
event_form = EventRecordForm() | |
context['event_form'] = event_form | |
payment_form = PaymentForm() | |
context['payment_form'] = payment_form | |
return context | |
@method_decorator(login_required, name='dispatch') | |
class PrintFormView(FormView): | |
form_class = PrintForm | |
success_url = '/' | |
def form_invalid(self, form): | |
return None | |
def form_valid(self, form): | |
template = form.cleaned_data['template'] | |
query_group = form.cleaned_data['query_group'] | |
query_students = form.cleaned_data['query_students'] | |
response = print_template(template, query_group, query_students) | |
return response | |
@method_decorator(login_required, name='dispatch') | |
class EventRecordFormView(FormView): | |
form_class = EventRecordForm | |
success_url = '/' | |
def form_invalid(self, form): | |
return HttpResponseBadRequest() | |
def form_valid(self, form): | |
event = form.cleaned_data['event'] | |
date = form.cleaned_data['date'] | |
time = form.cleaned_data['time'] | |
student = Student.objects.get(id=form.cleaned_data['student']) | |
comment = form.cleaned_data['comment'] | |
if event.id in [1, 2, 3]: | |
if event.id in [2, 3]: # can be 2 or 3 event_id | |
try: | |
ev_rec = EventRecord.objects.get(event__in=[2, 3], date=date, time=time) | |
if ev_rec.student is not None: | |
return JsonResponse({'error': 'студент уже записан на это время'}, status=406) | |
else: | |
ev_rec.event = event | |
ev_rec.student = student | |
ev_rec.comment = comment | |
ev_rec.save() | |
return JsonResponse({'created': False}) | |
except EventRecord.DoesNotExist: | |
EventRecord.objects.create(event=event, date=date, time=time, student=student, comment=comment) | |
return JsonResponse({'created': True}) | |
else: # single record | |
record, created = EventRecord.objects.get_or_create(event=event, date=date, time=time, | |
defaults={'student': student, 'comment': comment}) | |
if not created: | |
if record.student is not None: | |
return JsonResponse({'error': 'студент уже записан на это время'}, status=406) | |
else: | |
record.student = student | |
record.comment = comment | |
record.save() | |
return JsonResponse({'created': False}) | |
else: | |
return JsonResponse({'created': True}) | |
else: # any records on time | |
record, created = EventRecord.objects.get_or_create(event=event, date=date, time=time, student=student) | |
record.comment = comment | |
record.save() | |
return JsonResponse({'created': created}) | |
@method_decorator(login_required, name='dispatch') | |
class StudentList(ListView): | |
model = Student | |
context_object_name = 'students' | |
paginate_by = 100 | |
def get_queryset(self): | |
try: | |
name = self.request.GET['name'] | |
except KeyError: | |
name = '' | |
if name != '': | |
object_list = self.model.objects.filter(lastname__icontains=name) |\ | |
self.model.objects.filter(group__title__icontains=name) |\ | |
self.model.objects.filter(phone__icontains=name) | |
else: | |
object_list = self.model.objects.all() | |
object_list = object_list.order_by('group') # group already in desc sorting | |
return object_list | |
def get_context_data(self, **kwargs): | |
context = super().get_context_data(**kwargs) | |
template_form = PrintForm() | |
context['template_form'] = template_form | |
event_form = EventRecordForm() | |
context['event_form'] = event_form | |
payment_form = PaymentForm() | |
context['payment_form'] = payment_form | |
return context | |
@method_decorator(login_required, name='dispatch') | |
class StudentDetail(DetailView): | |
model = Student | |
context_object_name = 'student' | |
def get_context_data(self, **kwargs): | |
context = super().get_context_data(**kwargs) | |
context['student_list'] = [context['student']] | |
event_form = EventRecordForm() | |
context['event_form'] = event_form | |
payment_form = PaymentForm() | |
context['payment_form'] = payment_form | |
return context | |
class NewStudent(CreateView): | |
model = Student | |
template_name_suffix = '_new_form' | |
success_url = reverse_lazy('new_student_success') | |
form_class = AllRequiredStudentModelForm | |
class StudentRecords(View): | |
def get(self, request, *args, **kwargs): | |
phone = request.GET.get('phone', '') | |
phone = Student.clean_phone(phone) | |
context = dict() | |
if not phone: | |
context['events'] = [] | |
context['phone'] = '' | |
else: | |
context['phone'] = phone | |
context['events'] = EventRecord.objects.filter(student__phone=phone) | |
context['student'] = Student.objects.filter(phone=phone).first() | |
return render(request, 'student_records.html', context) | |
@method_decorator(login_required, name='dispatch') | |
class PaymentFormView(FormView): | |
form_class = PaymentForm | |
success_url = '/' | |
def form_invalid(self, form): | |
return HttpResponseBadRequest() | |
def form_valid(self, form): | |
form.save() | |
return super(PaymentFormView, self).form_valid(form) | |
class DateForm(forms.Form): | |
start = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), required=False) | |
end = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), required=False) | |
kassa = forms.BooleanField(required=False) | |
bank = forms.BooleanField(required=False) | |
@method_decorator(login_required, name='dispatch') | |
class PaymentList(View): | |
def get(self, request): | |
dateform = DateForm(request.GET) | |
dateform.is_valid() | |
start = dateform.cleaned_data.get('start') | |
end = dateform.cleaned_data.get('end') | |
kassa = dateform.cleaned_data.get('kassa') | |
bank = dateform.cleaned_data.get('bank') | |
query = Payment.objects.all() | |
if start: | |
query = query.filter(date__gte=start) | |
if end: | |
query = query.filter(date__lte=end) | |
if kassa: | |
query = query.filter(kassa=kassa).exclude(comment__contains='банк') | |
if bank: | |
query = query.filter(comment__contains='банк') | |
return render(request, 'main/payments_list.html', {'payments': query, | |
'total': query.aggregate(Sum('total'))['total__sum'] or 0, | |
'dateform': dateform}) | |
@method_decorator(login_required, name='dispatch') | |
class InstructorList(View): | |
def get(self, request): | |
all_students_with_real_ins = Student.objects.exclude(real_instructor=None).count() | |
query = Instructor.objects\ | |
.annotate(real_students_percent=Value(100.0) * Count('real_students') / Value(all_students_with_real_ins))\ | |
.order_by('-real_students_percent') | |
return render(request, 'main/instuctor_list.html', {'instructors': query}) | |
@method_decorator(login_required, name='dispatch') | |
class GibddTableView(View): | |
def get(self, request): | |
group_id = request.GET.get('group_id', '') | |
student_id = request.GET.get('student_id', '') | |
if group_id: | |
students = Group.objects.get(pk=group_id).students.all() | |
else: | |
students = [Student.objects.get(pk=student_id)] | |
return render(request, 'main/gibdd_table.html', {'students': students}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment