def test_get_specific_date(self): date_user = datetime(2012, 11, 1) dlist = DiningList.get_specific_date(date_user.day, date_user.month, date_user.year) self.assertEqual(dlist.relevant_date, date_user) # Test that we cannot get dates from the future date_user = datetime(2050, 11, 1) dlist = DiningList.get_specific_date(date_user.day, date_user.month, date_user.year) self.assertEqual(dlist.relevant_date, datetime.now().date())
def test_claim(self): dlist = DiningList.get_latest() dlist.save() self.client.login(username="******", password="******") # We test claiming the dining list without participation r = self.client.get(self.view_url) dlist = DiningList.get_latest() self.assertIsNone(dlist.owner) # We test claiming the dining list with a participation dpart = DiningParticipation(user=self.testUser, dining_list=dlist) dpart.save() self.assertIsNone(dlist.owner) r = self.client.get(self.view_url) self.assertEqual(r.status_code, 302) dlist = DiningList.get_latest() self.assertIsNotNone(dlist.owner) self.assertEqual(dlist.owner, self.testUser) # Test that you cannot claim a dining list over someone else dpart = DiningParticipation(user=self.testUser2, dining_list=dlist) dpart.save() self.client.login(username=self.testUser2.username, password="******") r = self.client.get(self.view_url) self.assertEqual(r.status_code, 302) dlist = DiningList.get_latest() self.assertNotEqual(dlist.owner, self.testUser2) self.assertEqual(dlist.owner, self.testUser) dpart.delete() dlist.delete()
def get(self, request, id=None): dining_list = DiningList.get_latest() if id == None: if dining_list.owner is not None and datetime.now().time() > dining_list.closing_time: messages.error(request, "De eetlijst is al geclaimed. Vraag aan de kok/bestuur of je er nog af mag.") return redirect("dining:index") if dining_list.user_in_list(request.user): if dining_list.owner == request.user: dining_list.owner = None dining_list.save() dining_list.remove_user(request.user) messages.success(request, "Je bent uitgeschreven van deze eetlijst") else: messages.error(request, "Je staat nog niet op deze eetlijst") else: if request.user == dining_list.owner: part = DiningParticipation.objects.get(id=id) part.mail("Je bent verwijderd van de eetlijst", "De kok gaat koken met een van de items op jouw \"Haal me van de eet-lijst\" items. Hierdoor ben je van de eetlijst afgehaald.") messages.success(request, u"{0} is van de eetlijst afgegooid.".format(part.user.get_full_name())) part.delete() else: messages.error(request, "Je hebt hier geen rechten voor!") return redirect("dining:index")
def post(self, request): form = CommentForm(request.POST) if form.is_valid(): obj = form.save(commit=False) obj.user = request.user obj.dining_list = DiningList.get_latest() obj.save() if obj.broadcast and (request.user.is_superuser or request.user == obj.dining_list.owner): print("Broadcasting") for part in obj.dining_list.get_participants(): part.mail( "{0} heeft een bericht gestuurd over de eetlijst!". format(request.user.get_full_name()), obj.body) messages.success(request, "Bericht was gebroadcast naar iedereen!") elif obj.broadcast: messages.error(request, "Je hebt geen rechten om dit te doen!") messages.success(request, "Comment posted") return redirect("dining:index") self.context['form'] = form return render(request, self.template_name, self.context)
def get(self, request, day=None, month=None, year=None): if day is not None: self.context['dinnerlist'] = DiningList.get_specific_date(day, month, year) else: self.context['dinnerlist'] = DiningList.get_latest() self.context['comments'] = self.context['dinnerlist'].get_comments() self.context['my_participation'] = True if DiningParticipation.objects.filter(user=request.user, dining_list=self.context[ 'dinnerlist']).count() == 1 else False self.context['participants'] = self.context['dinnerlist'].get_participants().prefetch_related() self.context['thirds'] = self.context['dinnerlist'].get_thirds() self.context['total'] = self.context['thirds'].count() + self.context['participants'].count() return render(request, self.template, self.context)
def get(self, request): dinnerlist = DiningList.get_latest() #check if today is a special day special_dates = SpecialDateModel.objects.filter( date_implied=datetime.now()).filter(date_is_registerable=False) if len(special_dates) > 0: messages.error( request, "Vandaag is er een speciale activiteit, hierdoor geldt de eetlijst vandaag niet" ) return redirect("dining:index") # 14:00 vanwege tijdzones if datetime.now().time() > dinnerlist.closing_time: messages.error( request, "De eetlijst is officieel gesloten. Vraag aan de koks of je er nog op mag" ) else: # See if the user is already registered obj, ret = DiningParticipation.objects.get_or_create( user=request.user, dining_list=dinnerlist) if ret: messages.success( request, "Je bent succesvol ingeschreven voor deze eetlijst") else: messages.info(request, "Je was al ingeschreven voor deze lijst") return redirect("dining:index")
def get(self, request): dining_list = DiningList.get_latest() if dining_list.owner is not None: messages.error( request, "Deze eetlijst is al geclaimd door {0}".format( dining_list.owner.get_full_name())) elif request.user.details.is_softbanned: messages.error( request, "Je bent tijdelijk gebanned vanwege de volgende reden: {0}". format(request.user.details.ban_reason)) else: # check participation if DiningParticipation.objects.filter( user=request.user, dining_list=dining_list).count() > 0: messages.success(request, "Je bent nu eigenaar van deze eetlijst!") dining_list.owner = request.user dining_list.save() else: messages.warning( request, "Je bent nog niet ingeschreven voor deze eetlijst! Doe dit eerst" ) return redirect("dining:index")
def post(self, request): form = CommentForm(request.POST) if form.is_valid(): obj = form.save(commit=False) obj.user = request.user obj.dining_list = DiningList.get_latest() obj.save() if obj.broadcast and (request.user.is_superuser or request.user == obj.dining_list.owner): print("Broadcasting") for part in obj.dining_list.get_participants(): part.mail("{0} heeft een bericht gestuurd over de eetlijst!".format(request.user.get_full_name()), obj.body) messages.success(request, "Bericht was gebroadcast naar iedereen!") elif obj.broadcast: messages.error(request, "Je hebt geen rechten om dit te doen!") messages.success(request, "Comment posted") return redirect("dining:index") self.context['form'] = form return render(request, self.template_name, self.context)
def get_context_data(self, **kwargs): context = super().get_context_data() context.update({ 'slot_form': CreateSlotForm(self.request.user, instance=DiningList(date=self.date)) }) return context
class DiningListCleanTestCase(TestCase): @classmethod def setUpTestData(cls): cls.user = User.objects.create_user('ankie') cls.association = Association.objects.create() def setUp(self): self.dining_list = DiningList(date=date(2123, 1, 2), sign_up_deadline=datetime( 2100, 2, 2, tzinfo=timezone.utc), association=self.association) def test_sign_up_deadline_valid(self): self.dining_list.full_clean() # Shouldn't raise def test_sign_up_deadline_after_date(self): self.dining_list.sign_up_deadline = datetime(2123, 1, 3, 18, 00) self.assertRaises(ValidationError, self.dining_list.full_clean)
def get(self, request): context = {} context['dining_stats'] = DiningStats.objects.get_or_create(user=request.user)[0] context['achievements'] = AchievementGet.objects.filter(user=request.user) if len([x for x in DiningList.get_latest().get_participants() if x.user == request.user]) > 0: context['on_dining_list'] = True return render(request, 'account/index.html', context)
def get(self, request): dinnerlist = DiningList.get_latest() if datetime.now().time() > dinnerlist.closing_time and request.user != dinnerlist.owner: messages.error(request, "De eetlijst is officieel gesloten. Vraag aan de koks of je er nog op mag") return redirect("dining:index") self.context['form'] = DiningThirdNewForm() return render(request, self.template, self.context)
def get(self, request): if not request.user.is_superuser: messages.error("Je hebt hier geen privileges voor!") return redirect("dining:index") send_mail("Eetlijst is afgezegd", "{} heeft deze afgezegd".format(request.user.get_full_name()), "*****@*****.**", ("*****@*****.**",)) [part.cancel() for part in DiningList.get_latest().get_participants()] messages.success(request, "Eetlijst is afgezegd") return redirect("dining:index")
def get(self, request, day=None, month=None, year=None): if day is not None: self.context['dinnerlist'] = DiningList.get_specific_date( day, month, year) else: self.context['dinnerlist'] = DiningList.get_latest() self.context['comments'] = self.context['dinnerlist'].get_comments() self.context[ 'my_participation'] = True if DiningParticipation.objects.filter( user=request.user, dining_list=self.context['dinnerlist']).count() == 1 else False self.context['participants'] = self.context[ 'dinnerlist'].get_participants().prefetch_related() self.context['thirds'] = self.context['dinnerlist'].get_thirds() self.context['total'] = self.context['thirds'].count( ) + self.context['participants'].count() return render(request, self.template, self.context)
def post(self, request, *args, **kwargs): context = self.get_context_data() context['slot_form'] = CreateSlotForm( request.user, request.POST, instance=DiningList(date=self.date)) if context['slot_form'].is_valid(): dining_list = context['slot_form'].save() messages.success(request, "You successfully created a new dining list") return redirect(dining_list) return self.render_to_response(context)
class DiningListTestCase(TestCase): @classmethod def setUpTestData(cls): cls.user = User.objects.create_user('ankie') cls.association = Association.objects.create() def setUp(self): self.dining_list = DiningList(date=date(2123, 1, 2), sign_up_deadline=datetime( 2100, 2, 2, tzinfo=timezone.utc), association=self.association) def test_is_open(self): list = DiningList.objects.create(date=date(2015, 1, 1), association=self.association, sign_up_deadline=datetime( 2015, 1, 1, 17, 00, tzinfo=timezone.utc)) with patch.object(timezone, 'now', return_value=datetime(2015, 1, 1, 16, 59, tzinfo=timezone.utc)): self.assertTrue(list.is_open()) with patch.object(timezone, 'now', return_value=datetime(2015, 1, 1, 17, 00, tzinfo=timezone.utc)): self.assertFalse(list.is_open()) with patch.object(timezone, 'now', return_value=datetime(2015, 1, 1, 17, 1, tzinfo=timezone.utc)): self.assertFalse(list.is_open()) def test_is_owner(self): self.dining_list.save() self.dining_list.owners.add(self.user) self.assertTrue(self.dining_list.is_owner(self.user)) def test_is_owner_false(self): self.dining_list.save() self.assertFalse(self.dining_list.is_owner(self.user))
def get(self, request): if not request.user.is_superuser: messages.error("Je hebt hier geen privileges voor!") return redirect("dining:index") send_mail( "Eetlijst is afgezegd", "{} heeft deze afgezegd".format(request.user.get_full_name()), "*****@*****.**", ("*****@*****.**", )) [part.cancel() for part in DiningList.get_latest().get_participants()] messages.success(request, "Eetlijst is afgezegd") return redirect("dining:index")
def get(self, request): dinnerlist = DiningList.get_latest() if datetime.now().time( ) > dinnerlist.closing_time and request.user != dinnerlist.owner: messages.error( request, "De eetlijst is officieel gesloten. Vraag aan de koks of je er nog op mag" ) return redirect("dining:index") self.context['form'] = DiningThirdNewForm() return render(request, self.template, self.context)
def test_association_unique_for_date(self): """Tests that there can be only one dining slot for an association for each date.""" # Save one dining list self.form.save() # Try creating another one with same association dl = DiningList(date=self.dining_date) data = { 'dish': 'Kwark', 'association': str(self.association1.pk), 'max_diners': '18', 'serve_time': '17:00' } form = CreateSlotForm(self.user1, data, instance=dl) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error('association'))
def test_get_registered_user(self): dlist = DiningList().get_latest() dlist.save() dpart = DiningParticipation(user=self.testUser, dining_list=dlist) dpart.save() # Tests self.assertEqual(len(dlist.get_participants()), 1) dpart.delete() dlist.delete()
def get(self, request): dining_list = DiningList.get_latest() if dining_list.owner is not None: messages.error(request, "Deze eetlijst is al geclaimd door {0}".format(dining_list.owner.get_full_name())) elif request.user.details.is_softbanned: messages.error(request, "Je bent tijdelijk gebanned vanwege de volgende reden: {0}".format( request.user.details.ban_reason)) else: # check participation if DiningParticipation.objects.filter(user=request.user, dining_list=dining_list).count() > 0: messages.success(request, "Je bent nu eigenaar van deze eetlijst!") dining_list.owner = request.user dining_list.save() else: messages.warning(request, "Je bent nog niet ingeschreven voor deze eetlijst! Doe dit eerst") return redirect("dining:index")
def setUp(self): self.association1 = Association.objects.create(name="Quadrivium") self.user1 = User.objects.create_user('jan') UserMembership.objects.create(related_user=self.user1, association=self.association1, is_verified=True, verified_on=timezone.now()) # Date two days in the future self.dining_date = timezone.now().date() + timedelta(days=2) self.form_data = { 'dish': 'Kwark', 'association': str(self.association1.pk), 'max_diners': '18', 'serve_time': '17:00' } self.dining_list = DiningList(date=self.dining_date) self.form = CreateSlotForm(self.user1, self.form_data, instance=self.dining_list)
def get(self, request): context = {} context['dining_stats'] = DiningStats.objects.get_or_create( user=request.user)[0] context['achievementgets'] = AchievementGet.objects.filter( user=request.user) context['gets'] = AchievementGet.objects.order_by( 'user__first_name').filter( achievement__gets__user=request.user).distinct() context['events'] = Event.get_upcoming() if len([ x for x in DiningList.get_latest().get_participants() if x.user == request.user ]) > 0: context['on_dining_list'] = True return render(request, 'account/index.html', context)
def get(self, request): dinnerlist = DiningList.get_latest() #check if today is a special day special_dates = SpecialDateModel.objects.filter(date_implied=datetime.now()).filter(date_is_registerable=False) if len(special_dates) > 0: messages.error(request, "Vandaag is er een speciale activiteit, hierdoor geldt de eetlijst vandaag niet") return redirect("dining:index") # 14:00 vanwege tijdzones if datetime.now().time() > dinnerlist.closing_time: messages.error(request, "De eetlijst is officieel gesloten. Vraag aan de koks of je er nog op mag") else: # See if the user is already registered obj, ret = DiningParticipation.objects.get_or_create(user=request.user, dining_list=dinnerlist) if ret: messages.success(request, "Je bent succesvol ingeschreven voor deze eetlijst") else: messages.info(request, "Je was al ingeschreven voor deze lijst") return redirect("dining:index")
def test_new_participation(self): dlist = DiningList.get_latest() dlist.owner = self.testUser dlist.save() dpart = DiningParticipation(user=self.testUser, dining_list=dlist) dpart.work_cook = True dpart.save() dstats = DiningStats.objects.get(user=self.testUser) self.assertEquals(dstats.total_helped, 1) self.assertEquals(dstats.total_participated, 1) # Now we update dpart.work_cook = False dpart.save() dstats = DiningStats.objects.get(user=self.testUser) self.assertEqual(dstats.total_helped, 0) self.assertEqual(dstats.total_participated, 1) # Now we test for cooking and dishes at the same time dpart.work_cook = True dpart.work_dishes = True dpart.save() dstats = DiningStats.objects.get(user=self.testUser) self.assertEqual(dstats.total_helped, 2) self.assertEqual(dstats.total_participated, 1)
def post(self, request, day=None, month=None, year=None): regex_filter = r'(\d+):(\w+)' # todo: secure this post = request.POST # first we'll clear all current statusses dinnerlist = DiningList.get_latest() participants = dinnerlist.get_participants().select_related() for part in participants: part.work_groceries = False part.work_cook = False part.work_dishes = False for key in post.keys(): m = re.match(regex_filter, key) if m: part = [x for x in participants if x.id == int(m.group(1))][0] if m.group(2) == "groceries": part.work_groceries = True if m.group(2) == "cooking": part.work_cook = True if m.group(2) == "dishes": part.work_dishes = True if m.group(2) == "paid": part.paid = True for part in participants: part.save() messages.success(request, "Behandelingen zijn successvol doorgevoerd") return redirect("dining:index")
def test_invalid_association(self): """Tests using an association which the user is not a member of. NOTE: when there is 1 available association, the form sets the association field to disabled. This means that the value that is sent with the form is totally ignored in favor of the initial value of the field. Therefore setting a different invalid association in the form data results in the form data actually being valid, but it does not use this association, instead it uses the other association which the user is actually a member of. Source: https://docs.djangoproject.com/en/2.2/ref/forms/fields/#disabled """ association = Association.objects.create(name='Knights') form_data = { 'dish': 'Boter', 'association': str(association.pk), 'max_diners': '20', 'serve_time': '18:00' } form = CreateSlotForm(self.user1, form_data, instance=DiningList(date=self.dining_date)) self.assertTrue(form.is_valid()) # Check that the actual association is not Knights but Quadrivium self.assertEqual(self.association1, form.instance.association)
def get(self, request, id=None): dining_list = DiningList.get_latest() if id == None: if dining_list.owner is not None and datetime.now().time( ) > dining_list.closing_time: messages.error( request, "De eetlijst is al geclaimed. Vraag aan de kok/bestuur of je er nog af mag." ) return redirect("dining:index") if dining_list.user_in_list(request.user): if dining_list.owner == request.user: dining_list.owner = None dining_list.save() dining_list.remove_user(request.user) messages.success(request, "Je bent uitgeschreven van deze eetlijst") else: messages.error(request, "Je staat nog niet op deze eetlijst") else: if request.user == dining_list.owner: part = DiningParticipation.objects.get(id=id) part.mail( "Je bent verwijderd van de eetlijst", "De kok gaat koken met een van de items op jouw \"Haal me van de eet-lijst\" items. Hierdoor ben je van de eetlijst afgehaald." ) messages.success( request, u"{0} is van de eetlijst afgegooid.".format( part.user.get_full_name())) part.delete() else: messages.error(request, "Je hebt hier geen rechten voor!") return redirect("dining:index")
def test_get_latest(self): dlist = DiningList.get_latest() self.assertEqual(dlist.relevant_date, datetime.now().date())
def setUp(self): self.dining_list = DiningList(date=date(2123, 1, 2), sign_up_deadline=datetime( 2100, 2, 2, tzinfo=timezone.utc), association=self.association)