Skip to content

Instantly share code, notes, and snippets.

@Kulikovpavel
Last active August 4, 2017 06:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Kulikovpavel/f00c3787a0794b1dc8fbc338f25521fa to your computer and use it in GitHub Desktop.
Save Kulikovpavel/f00c3787a0794b1dc8fbc338f25521fa to your computer and use it in GitHub Desktop.
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