Merge branch 'jewels_subscription' into 'master'

Jewels subscription

See merge request !98
This commit is contained in:
Skia 2017-08-31 17:45:54 +02:00
commit 0532f7337a
4 changed files with 89 additions and 28 deletions

View File

@ -4387,41 +4387,45 @@ msgstr "Membre de Sbarro ou de l'ESTA, 15 €"
#: sith/settings.py:483 #: sith/settings.py:483
msgid "One semester Welcome Week" msgid "One semester Welcome Week"
msgstr "Un semestre - Welcome Week 0 €" msgstr "Un semestre Welcome Week"
#: sith/settings.py:505 #: sith/settings.py:513
msgid "Two month for free"
msgstr "Deux mois gratuits"
#: sith/settings.py:510
msgid "President" msgid "President"
msgstr "Président" msgstr "Président"
#: sith/settings.py:506 #: sith/settings.py:511
msgid "Vice-President" msgid "Vice-President"
msgstr "Vice-Président" msgstr "Vice-Président"
#: sith/settings.py:507 #: sith/settings.py:512
msgid "Treasurer" msgid "Treasurer"
msgstr "Trésorier" msgstr "Trésorier"
#: sith/settings.py:508 #: sith/settings.py:513
msgid "Communication supervisor" msgid "Communication supervisor"
msgstr "Responsable communication" msgstr "Responsable communication"
#: sith/settings.py:509 #: sith/settings.py:514
msgid "Secretary" msgid "Secretary"
msgstr "Secrétaire" msgstr "Secrétaire"
#: sith/settings.py:510 #: sith/settings.py:515
msgid "IT supervisor" msgid "IT supervisor"
msgstr "Responsable info" msgstr "Responsable info"
#: sith/settings.py:511 #: sith/settings.py:516
msgid "Board member" msgid "Board member"
msgstr "Membre du bureau" msgstr "Membre du bureau"
#: sith/settings.py:512 #: sith/settings.py:517
msgid "Active member" msgid "Active member"
msgstr "Membre actif" msgstr "Membre actif"
#: sith/settings.py:513 #: sith/settings.py:517
msgid "Curious" msgid "Curious"
msgstr "Curieux" msgstr "Curieux"
@ -4445,7 +4449,7 @@ msgstr "Nouvelles photos/albums à modérer dans le SAS"
msgid "You've been identified on some pictures" msgid "You've been identified on some pictures"
msgstr "Vous avez été identifié sur des photos" msgstr "Vous avez été identifié sur des photos"
#: sith/settings.py:553 #: sith/settings.py:558
#, python-format #, python-format
msgid "You just refilled of %s €" msgid "You just refilled of %s €"
msgstr "Vous avez rechargé votre compte de %s €" msgstr "Vous avez rechargé votre compte de %s €"
@ -4455,27 +4459,28 @@ msgstr "Vous avez rechargé votre compte de %s €"
msgid "You just bought %s" msgid "You just bought %s"
msgstr "Vous avez acheté %s" msgstr "Vous avez acheté %s"
#: sith/settings.py:555 #: sith/settings.py:563
#: sith/settings.py:560
msgid "You have a notification" msgid "You have a notification"
msgstr "Vous avez une notification" msgstr "Vous avez une notification"
#: sith/settings.py:559 #: sith/settings.py:564
msgid "Success!" msgid "Success!"
msgstr "Succès !" msgstr "Succès !"
#: sith/settings.py:560 #: sith/settings.py:565
msgid "Fail!" msgid "Fail!"
msgstr "Échec !" msgstr "Échec !"
#: sith/settings.py:561 #: sith/settings.py:566
msgid "You successfully posted an article in the Weekmail" msgid "You successfully posted an article in the Weekmail"
msgstr "Article posté avec succès dans le Weekmail" msgstr "Article posté avec succès dans le Weekmail"
#: sith/settings.py:562 #: sith/settings.py:567
msgid "You successfully edited an article in the Weekmail" msgid "You successfully edited an article in the Weekmail"
msgstr "Article édité avec succès dans le Weekmail" msgstr "Article édité avec succès dans le Weekmail"
#: sith/settings.py:563 #: sith/settings.py:568
msgid "You successfully sent the Weekmail" msgid "You successfully sent the Weekmail"
msgstr "Weekmail envoyé avec succès" msgstr "Weekmail envoyé avec succès"

View File

@ -484,6 +484,11 @@ SITH_SUBSCRIPTIONS = {
'price': 0, 'price': 0,
'duration': 1, 'duration': 1,
}, },
'deux-mois-essai': {
'name': _('Two month for free'),
'price': 0,
'duration': 0.33,
}
# To be completed.... # To be completed....
} }

View File

@ -104,6 +104,7 @@ class Subscription(models.Model):
'sbarro/esta': 9, 'sbarro/esta': 9,
'cursus-alternant': 10, 'cursus-alternant': 10,
'welcome-semestre': 11, 'welcome-semestre': 11,
'deux-mois-essai': 12,
} }
PAYMENT = { PAYMENT = {
"CHECK": 1, "CHECK": 1,
@ -168,11 +169,11 @@ class Subscription(models.Model):
start = Subscription.compute_start(duration=duration) start = Subscription.compute_start(duration=duration)
# This can certainly be simplified, but it works like this # This can certainly be simplified, but it works like this
try: try:
return start.replace(month=(start.month - 1 + 6 * duration) % 12 + 1, return start.replace(month=int(round((start.month - 1 + 6 * duration) % 12 + 1, 0)),
year=start.year + int(duration / 2) + (1 if start.month > 6 and duration % 2 == 1 else 0)) year=int(round(start.year + int(duration / 2) + (1 if int(start.month + 6 * duration) > 12 and (duration % 2 == 1 or duration < 1) else 0), 0)))
except ValueError as e: except ValueError as e:
return start.replace(day=1, month=(start.month + 6 * duration) % 12 + 1, return start.replace(day=1, month=int(round((start.month + 6 * duration) % 12 + 1, 0)),
year=start.year + int(duration / 2) + (1 if start.month > 6 and duration % 2 == 1 else 0)) year=int(round(start.year + int(duration / 2) + (1 if int(start.month + 6 * duration) > 12 and (duration % 2 == 1 or duration < 1) else 0), 0)))
def can_be_edited_by(self, user): def can_be_edited_by(self, user):
return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP) or user.is_root return user.is_in_group(settings.SITH_MAIN_BOARD_GROUP) or user.is_root

View File

@ -26,16 +26,23 @@ from unittest import mock
from django.test import TestCase from django.test import TestCase
from subscription.models import Subscription from subscription.models import Subscription
from core.models import User
from django.conf import settings
from datetime import datetime
from django.core.management import call_command
class FakeDate(date): class FakeDate(date):
"""A fake replacement for date that can be mocked for testing.""" """A fake replacement for date that can be mocked for testing."""
def __new__(cls, *args, **kwargs): def __new__(cls, *args, **kwargs):
return date.__new__(date, *args, **kwargs) return date.__new__(date, *args, **kwargs)
def date_mock_today(year, month, day): def date_mock_today(year, month, day):
FakeDate.today = classmethod(lambda cls: date(year, month, day)) FakeDate.today = classmethod(lambda cls: date(year, month, day))
class SubscribtionTest(TestCase):
class SubscriptionTest(TestCase):
@mock.patch('subscription.models.date', FakeDate) @mock.patch('subscription.models.date', FakeDate)
def test_start_dates_sliding_without_start(self): def test_start_dates_sliding_without_start(self):
@ -60,10 +67,8 @@ class SubscribtionTest(TestCase):
self.assertTrue(Subscription.compute_start(duration=4) == date(2015, 8, 15)) self.assertTrue(Subscription.compute_start(duration=4) == date(2015, 8, 15))
def test_start_dates_not_sliding_with_start(self): def test_start_dates_not_sliding_with_start(self):
self.assertTrue(Subscription.compute_start(date(2015, 5, 17), 3) == self.assertTrue(Subscription.compute_start(date(2015, 5, 17), 3) == date(2015, 2, 15))
date(2015, 2, 15)) self.assertTrue(Subscription.compute_start(date(2015, 1, 11), 3) == date(2014, 8, 15))
self.assertTrue(Subscription.compute_start(date(2015, 1, 11), 3) ==
date(2014, 8, 15))
@mock.patch('subscription.models.date', FakeDate) @mock.patch('subscription.models.date', FakeDate)
def test_end_dates_sliding(self): def test_end_dates_sliding(self):
@ -81,9 +86,54 @@ class SubscribtionTest(TestCase):
d = Subscription.compute_end(duration=4) d = Subscription.compute_end(duration=4)
self.assertTrue(d == date(2017, 8, 15)) self.assertTrue(d == date(2017, 8, 15))
@mock.patch('subscription.models.date', FakeDate)
def test_end_dates_with_float(self):
date_mock_today(2015, 9, 18)
d = Subscription.compute_end(duration=0.33)
self.assertTrue(d == date(2015, 11, 18))
d = Subscription.compute_end(duration=0.67)
self.assertTrue(d == date(2016, 1, 18))
d = Subscription.compute_end(duration=0.5)
self.assertTrue(d == date(2015, 12, 18))
def test_end_dates_not_sliding_with_start(self): def test_end_dates_not_sliding_with_start(self):
d = Subscription.compute_end(duration=3, start=date(2015, 9, 18)) d = Subscription.compute_end(duration=3, start=date(2015, 9, 18))
self.assertTrue(d == date(2017, 3, 18)) self.assertTrue(d == date(2017, 3, 18))
d = Subscription.compute_end(duration=4, start=date(2015, 9, 18)) d = Subscription.compute_end(duration=4, start=date(2015, 9, 18))
self.assertTrue(d == date(2017, 9, 18)) self.assertTrue(d == date(2017, 9, 18))
class DecimalDurationTest(TestCase):
def setUp(self):
call_command("populate")
self.user = User.objects.filter(username="public").first()
def test_duration_two_months(self):
s = Subscription(member=User.objects.filter(pk=self.user.pk).first(), subscription_type=list(settings.SITH_SUBSCRIPTIONS.keys())[3],
payment_method=settings.SITH_SUBSCRIPTION_PAYMENT_METHOD[0])
s.subscription_start = date(2017, 8, 29)
s.subscription_end = s.compute_end(duration=0.33,
start=s.subscription_start)
s.save()
self.assertTrue(s.subscription_end == date(2017, 10, 29))
def test_duration_three_months(self):
s = Subscription(member=User.objects.filter(pk=self.user.pk).first(), subscription_type=list(settings.SITH_SUBSCRIPTIONS.keys())[3],
payment_method=settings.SITH_SUBSCRIPTION_PAYMENT_METHOD[0])
s.subscription_start = date(2017, 8, 29)
s.subscription_end = s.compute_end(duration=0.5,
start=s.subscription_start)
s.save()
self.assertTrue(s.subscription_end == date(2017, 11, 29))
def test_duration_four_months(self):
s = Subscription(member=User.objects.filter(pk=self.user.pk).first(), subscription_type=list(settings.SITH_SUBSCRIPTIONS.keys())[3],
payment_method=settings.SITH_SUBSCRIPTION_PAYMENT_METHOD[0])
s.subscription_start = date(2017, 8, 29)
s.subscription_end = s.compute_end(duration=0.67,
start=s.subscription_start)
s.save()
self.assertTrue(s.subscription_end == date(2017, 12, 29))