def test_log_student_updated_added_event(self): """Check logging signal for newly created student""" # add own root handler to catch student signals output out = StringIO() handler = logging.StreamHandler(out) logging.root.addHandler(handler) # now create student, this should raise new message inside # our logger output file student = Student(first_name='Demo', last_name='Student') student.save() # check output file content out.seek(0) self.assertEqual(out.readlines()[-1], 'Student added: Demo Student (ID: %d)\n' % student.id) # now update existing student and check last line in out student.ticket = '12345' student.save() out.seek(0) self.assertEqual( out.readlines()[-1], 'Student updated: Demo Student (ID: %d)\n' % student.id) # remove our handler from root logger logging.root.removeHandler(handler)
def students_add(request): if request.method == "POST": if request.POST.get('add_button') is not None: errors = {} data = {'middle_name': request.POST.get('middle_name'), 'notes': request.POST.get('notes')} first_name = request.POST.get('first_name', '').strip() if not first_name: errors['first_name'] = u"Ім'я є обов'язковим" else: data['first_name'] = first_name last_name = request.POST.get('last_name', '').strip() if not last_name: errors['last_name']=u"Прізвище є обов'язковим" else: data['last_name']=last_name birthday = request.POST.get('birthday', '').strip() if not birthday: errors['birthday']=u"Дата народження є обов'язковою" else: data['birthday']=birthday ticket = request.POST.get('ticket', '').strip() if not birthday: errors['ticket']=u"Студентський квиток є обов'язковим" else: data['ticket']=ticket student_group = request.POST.get('student_group', '').strip() if not birthday: errors['student_group']=u"Група є обов'язковою" else: data['student_group']=Group.objects.get(pk=student_group) photo = request.FILES.get('photo') if photo: data['photo'] = photo if not errors: student = Student(**data) student.save() return HttpResponseRedirect(u'%s?status_message=Студента успішно додано!' %reverse('home')) else: return render(request, 'students/students_add.html', {'groups': Group.objects.all().order_by('title'), 'errors': errors}) elif request.POST.get('cancel_button') is not None: return HttpResponseRedirect(u'%s?status_message=Додавання студента скасовано!' %reverse('home')) else: return render(request, 'students/students_add.html', {'groups': Group.objects.all().order_by('title')})
def test_log_student_deleted_event(self): """Check logging signals for deleted student""" student = Student(first_name='Demo', last_name='Student') student.save() # now override signal # add own root handler to catch student signals output out = StringIO() handler = logging.StreamHandler(out) logging.root.addHandler(handler) # delete existing student and check logger output sid = student.id student.delete() out.seek(0) self.assertEqual(out.readlines()[-1], 'Student deleted: Demo Student (ID: %d)\n' % sid) # remove our handler from root logger logging.root.removeHandler(handler)
def test_log_student_updated_added_event(self): """Check logging signal for newly created student""" # add own root handler to catch student signals output out = StringIO() handler = logging.StreamHandler(out) logging.root.addHandler(handler) # now create student, this should raise new message inside # our logger output file student = Student(first_name='Demo', last_name='Student') student.save() # check output file content out.seek(0) self.assertEqual(out.readlines()[-1], 'Student added: Demo Student (ID: %d)\n' % student.id) # now update existing student and check last line in out student.ticket = '12345' student.save() out.seek(0) self.assertEqual(out.readlines()[-1], 'Student updated: Demo Student (ID: %d)\n' % student.id) # remove our handler from root logger logging.root.removeHandler(handler)
def test_log_student_updated_added_event(self): out = StringIO() handler = logging.StreamHandler(out) logging.root.addHandler(handler) student = Student(first_name='Demo', last_name='Student') student.save() out.seek(0) self.assertEqual(out.readlines()[-1], 'Student added: Demo Student (ID: %d)\n' % student.id) student.ticker = '12345' student.save() out.seek(0) self.assertEqual( out.readlines()[-1], 'Student updated: Demo Student (ID: %d)\n' % student.id) logging.root.removeHandler(handler)
def test_log_student_deleted_event(self): # """Check logging signals for deleted student""" student = Student(first_name='Demo', last_name='Student') student.save() # # now override signal # # add own root handler to catch student signals output out = StringIO() handler = logging.StreamHandler(out) logging.root.addHandler(handler) # # delete existing student and check logger output sid = student.id student.delete() out.seek(0) self.assertEqual(out.readlines()[-1], 'Student deleted: Demo Student (ID: %d)\n' % sid) # # remove our handler from root logger logging.root.removeHandler(handler)
def test_unicode(self): student = Student(first_name='Demo', last_name='Student') self.assertEqual(unicode(student), u'Demo Student')
def students_add(request): # Якщо форма була запощена: # was form posted? if request.method == "POST": # Якщо кнопка Додати була натиснута: # was form add button clicked? if request.POST.get('add_button') is not None: data = { 'middle_name': request.POST['middle_name'], 'notes': request.POST['notes'] } # Перевіряємо дані на коректність та збираємо помилки # validate input from user errors = {} first_name = request.POST.get('first_name', '').strip() if not first_name: errors['first_name'] = "Ім'я є обов'язковим" else: data['first_name'] = first_name last_name = request.POST.get('last_name', '').strip() if not last_name: errors['last_name'] = "Прізвище є обов'язковим" else: data['last_name'] = last_name ticket = request.POST.get('ticket', '').strip() if not ticket: errors['ticket'] = "Квиток є обов'язковим" else: data['ticket'] = ticket birthday = request.POST.get('birthday', '').strip() if not birthday: errors['birthday'] = "Дата народження є обов'язковою" else: try: datetime.strptime(birthday, '%Y-%m-%d') except Exception: errors['birthday'] = \ "Введіть коректний формат дати (напр. 1984-12-30)" else: data['birthday'] = birthday student_group = request.POST['student_group'] if not student_group: errors['student_group'] = "Група є обов'язковою" else: groups = Group.objects.filter(pk=student_group) if len(groups) != 1: errors['student_group'] = "Оберіть коректну групу" else: data['student_group'] = groups[0] photo = request.FILES.get( 'photo') # об*єкт класу InMemoryUploadedFile FORMAT_PHOTO = ('jpg', 'jpeg', 'png', 'bmp') SIZE_PHOTO = 10 # 10MB - граничний розмір для фото SIZE_THUMNAIL = (500, 500) # Перевіряю на допустимий розмір файла if photo.size > SIZE_PHOTO * 1024 * 1000: errors['photo'] = "".join([ "Розмір фото не повинен перевищувати ", str(SIZE_PHOTO), " мегабайт" ]) photo = None if photo: # Користуюся пакетом PIL для відсіювання файлів які не є фото try: img = Image.open(photo) img.thumbnail(SIZE_THUMNAIL, Image.ANTIALIAS) thumb_io = BytesIO() _format = photo.content_type.split('/')[1] img.save(thumb_io, _format) # Ініціалізатор для InMemoryUploadedFile, дивись # /data/work/virtualenv3/studentsdb/lib/python3.4/site-packages/django/core/files/uploadedfile.py # __init__(self, file, field_name, name, content_type, size, charset, content_type_extra=None): _file = thumb_io field_name = photo.field_name name = "".join([ datetime.now().strftime("%Y-%m-%d %H-%M-%S"), ".", _format ]) content_type = photo.content_type im = InMemoryUploadedFile(_file, field_name, name, content_type, size=None, charset=None) data['photo'] = im #import pdb; pdb.set_trace(); except IOError: errors['photo'] = "Це повино бути фото, наприклад файли з розширеням %s" \ % ", ".join(FORMAT_PHOTO) #зберігаємо студента # Якщо дані були введені коректно: if not errors: # Створюємо та зберігаємо студента в базу #create student object student = Student(**data) student.save() #import pdb; pdb.set_trace(); # Повертаємо користувача до списку студентів # redirect user to students_list messages.success(request, 'Студента %s успішно додано!' % student) return HttpResponseRedirect(reverse('home')) # Якщо дані були введені некоректно: else: # Віддаємо шаблон форми разом із знайденими помилками # render form with errors and previous user input return render( request, 'students/forms/students_add.html', { 'groups': Group.objects.all().order_by('title'), 'errors': errors }) # Якщо кнопка Скасувати була натиснута: elif request.POST.get('cancel_button') is not None: #Повертаємо користувача до списку студентів #redirect to home page on cancel button messages.warning(request, 'Додавання студента скасовано!') return HttpResponseRedirect(reverse('home')) # Якщо форма не була запощена: else: # initial form render # повертаємо код початкового стану форми return render(request, 'students/forms/students_add.html', {'groups': Group.objects.all().order_by('title')})
def students_add(request): # Якщо форма була запощена: # was form posted? if request.method == "POST": # Якщо кнопка Додати була натиснута: # was form add button clicked? if request.POST.get('add_button') is not None: data = {'middle_name':request.POST['middle_name'], 'notes': request.POST['notes']} # Перевіряємо дані на коректність та збираємо помилки # validate input from user errors = {} first_name = request.POST.get('first_name','').strip() if not first_name: errors['first_name'] = "Ім'я є обов'язковим" else: data['first_name'] = first_name last_name = request.POST.get('last_name','').strip() if not last_name: errors['last_name'] = "Прізвище є обов'язковим" else: data['last_name'] = last_name ticket = request.POST.get('ticket','').strip() if not ticket: errors['ticket'] = "Квиток є обов'язковим" else: data['ticket'] = ticket birthday = request.POST.get('birthday','').strip() if not birthday: errors['birthday'] = "Дата народження є обов'язковою" else: try: datetime.strptime(birthday,'%Y-%m-%d') except Exception: errors['birthday'] = \ "Введіть коректний формат дати (напр. 1984-12-30)" else: data['birthday'] = birthday student_group = request.POST['student_group'] if not student_group: errors['student_group'] = "Група є обов'язковою" else: groups = Group.objects.filter(pk=student_group) if len(groups) != 1: errors['student_group'] = "Оберіть коректну групу" else: data['student_group'] = groups[0] photo = request.FILES.get('photo') # об*єкт класу InMemoryUploadedFile FORMAT_PHOTO = ('jpg', 'jpeg', 'png', 'bmp') SIZE_PHOTO = 10 # 10MB - граничний розмір для фото SIZE_THUMNAIL = (500, 500) # Перевіряю на допустимий розмір файла if photo.size >SIZE_PHOTO*1024*1000: errors['photo'] = "".join(["Розмір фото не повинен перевищувати ", str(SIZE_PHOTO), " мегабайт"]) photo = None if photo: # Користуюся пакетом PIL для відсіювання файлів які не є фото try: img = Image.open(photo) img.thumbnail(SIZE_THUMNAIL, Image.ANTIALIAS) thumb_io = BytesIO() _format = photo.content_type.split('/')[1] img.save(thumb_io, _format) # Ініціалізатор для InMemoryUploadedFile, дивись # /data/work/virtualenv3/studentsdb/lib/python3.4/site-packages/django/core/files/uploadedfile.py # __init__(self, file, field_name, name, content_type, size, charset, content_type_extra=None): _file = thumb_io field_name = photo.field_name name = "".join([datetime.now().strftime("%Y-%m-%d %H-%M-%S"),".", _format]) content_type = photo.content_type im = InMemoryUploadedFile(_file, field_name, name, content_type, size=None, charset=None) data['photo'] = im #import pdb; pdb.set_trace(); except IOError: errors['photo'] = "Це повино бути фото, наприклад файли з розширеням %s" \ % ", ".join(FORMAT_PHOTO) #зберігаємо студента # Якщо дані були введені коректно: if not errors: # Створюємо та зберігаємо студента в базу #create student object student = Student(**data) student.save() #import pdb; pdb.set_trace(); # Повертаємо користувача до списку студентів # redirect user to students_list messages.success(request, 'Студента %s успішно додано!' % student) return HttpResponseRedirect(reverse('home')) # Якщо дані були введені некоректно: else: # Віддаємо шаблон форми разом із знайденими помилками # render form with errors and previous user input return render(request,'students/forms/students_add.html', {'groups':Group.objects.all().order_by('title'), 'errors':errors}) # Якщо кнопка Скасувати була натиснута: elif request.POST.get('cancel_button') is not None: #Повертаємо користувача до списку студентів #redirect to home page on cancel button messages.warning(request, 'Додавання студента скасовано!') return HttpResponseRedirect(reverse('home')) # Якщо форма не була запощена: else: # initial form render # повертаємо код початкового стану форми return render(request,'students/forms/students_add.html', {'groups':Group.objects.all().order_by('title')})
def students_add(request): # testa = request.META['SERVER_NAME'] # print(request.build_absolute_uri('/')) ''' Метакод Якщо форма була запощена: Якщо кнопка Скасувати була натиснута: Повертаємо користувача до списку студентів Якщо кнопка Додати була натиснута: Перевіряємо дані на коректність та збираємо помилки Якщо дані були введені некоректно: Віддаємо шаблон форми разом із знайденими помилками Якщо дані були введені коректно: Створюємо та зберігаємо студента в базу Повертаємо користувача до списку студентів Якщо форма не була запощена: повертаємо код початкового стану форми ''' # was form Posted? if request.method =='POST': # was form add button clicked? if request.POST.get('add_button') is not None: # TODO: validate input from user # error colections errors = {} # validate student data will go here data = {'middle_name': request.POST.get('middle_name'), 'notes': request.POST.get('notes')} # validate user input first_name = request.POST.get('first_name', '').strip() if not first_name: errors['first_name'] = "Ім'я є обовязковим " else: data['first_name'] = first_name last_name = request.POST.get('last_name', '').strip() if not last_name: errors['last_name'] = "Прізвище є обовязковим " else: data['last_name'] = last_name birthday = request.POST.get('birthday', '').strip() if not birthday: errors['birthday'] = "Дата народження є обовязковою " else: try: datetime.strptime(birthday, '%Y-%m-%d') except Exception: errors['birthday'] = 'Введіть коректний формат дати (напр. 1975-10-28)' else: data['birthday'] = birthday ticket = request.POST.get('ticket', '').strip() if not ticket: errors['ticket'] = "Номер білета є обовязковим " else: data['ticket'] = ticket student_group = request.POST.get('student_group', '').strip() if not student_group: errors['student_group'] = 'Оберіть групу для студента' else: groups = Group.objects.filter(pk = student_group) if len(groups) !=1: errors['student_group'] = "Оберіть коректну групу" else: data['student_group'] = groups[0] photo = request.FILES.get('photo') if photo: data['photo'] = photo # save student if not errors: student = Student(**data) # як варіант через перевірку словника errors # create Student Object - вважаєм що всі дані внесенно і вони правильні! # student = Student( # first_name = request.POST['first_name'], # last_name = request.POST['last_name'], # middle_name = request.POST['middle_name'], # birthday = request.POST['birthday'], # ticket = request.POST['ticket'], # student_group = Group.objects.get(pk = request.POST['student_group']), # photo = request.FILES['photo'], # ) # save it to database student.save() # redirect user to student list return HttpResponseRedirect('%s?status_message=Студента успішно додано!' % reverse('home')) else: # render form with errors and previous user input return render(request, 'students/students_add.html', {'groups': Group.objects.all().order_by('title'), 'errors': errors}) elif request.POST.get('cancel_button') is not None: # redirect to home page on Cansel Button return HttpResponseRedirect('%s?status_message=Додавання студента скасовано!' % reverse('home')) else: # initial form render return render(request, 'students/students_add.html', {'groups' : Group.objects.all().order_by('title')})