Commit fa8d9f9a authored by lizonr1's avatar lizonr1

Split loyaltyMe into loyaltyMe and promotion apps

parent 75418b96
# Register your models here. # Register your models here.
from django.contrib import admin from django.contrib import admin
from App.loyaltyMe.models import Task
admin.site.register(Task)
\ No newline at end of file
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from App.loyaltyMe.models import Place, Offer, PromotionSet, Localization, Beacon from App.loyaltyMe.models import Place, Offer, Localization, Beacon
from App.promotion.models import PromotionSet
class Command(BaseCommand): class Command(BaseCommand):
......
from django.db import models from django.db import models
# Create your models here. # Create your models here.
class Product(models.Model): class Product(models.Model):
name = models.CharField(max_length=50) name = models.CharField(max_length=50)
description = models.CharField(max_length=50) description = models.CharField(max_length=50)
...@@ -15,53 +17,6 @@ class Offer(models.Model): ...@@ -15,53 +17,6 @@ class Offer(models.Model):
products = models.ManyToManyField(Product) products = models.ManyToManyField(Product)
class Task(models.Model):
TIME = 'TM'
PRESENCE = 'PR'
TYPE_CHOICES = (
(TIME, 'Time'),
(PRESENCE, 'Presence'),
)
type = models.CharField(max_length=2, choices=TYPE_CHOICES, default=PRESENCE)
update_delay = models.DurationField() # raz na dzień? Tego nie widzi usera
description = models.CharField(max_length=50)
name = models.CharField(max_length=50)
counter_target = models.IntegerField() #badz 10 razy #badz przez m # To widzi user #cel koncowy
counter_incrementation = models.IntegerField() # o 1 # Tego nie widzi user
beacon_counter_target = models.IntegerField() # 3x # 1x # tego nie widiz user
beacon_signal_delay = models.DurationField() # przez 5minut # co 5 minut #tego nie widzi user
beacon_singal_delay_maximum_delay = models.DurationField() # ale po 20 minutach sie restartuje
def __str__(self):
return self.name
class Promotion(models.Model):
AVAILABLE = 'AV'
NON_AVAILABLE = 'NAV'
STATUS_CHOICES = (
(AVAILABLE, 'Available'),
(NON_AVAILABLE, 'Non Available'),
)
name = models.CharField(max_length=50)
description = models.CharField(max_length=50)
code = models.CharField(max_length=50)
img = models.ImageField()
status = models.CharField(max_length=2, choices=STATUS_CHOICES, default=AVAILABLE)
task = models.ForeignKey(Task)
left_number = models.IntegerField(null=True)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
class PromotionSet(models.Model):
name = models.CharField(max_length=50)
promotions = models.ManyToManyField(Promotion, default='')
class Localization(models.Model): class Localization(models.Model):
latitude = models.CharField(max_length=50, ) latitude = models.CharField(max_length=50, )
longitude = models.CharField(max_length=50, ) longitude = models.CharField(max_length=50, )
...@@ -85,6 +40,6 @@ class Place(models.Model): ...@@ -85,6 +40,6 @@ class Place(models.Model):
logo_img = models.ImageField() logo_img = models.ImageField()
description = models.CharField(max_length=50) description = models.CharField(max_length=50)
offer = models.ForeignKey(Offer, null=True, blank=True) offer = models.ForeignKey(Offer, null=True, blank=True)
promotion = models.ForeignKey(PromotionSet, null=True, blank=True) promotion = models.ForeignKey('promotion.PromotionSet', null=True, blank=True)
localization = models.ForeignKey(Localization, null=True, blank=True) localization = models.ForeignKey(Localization, null=True, blank=True)
beacon = models.ForeignKey(Beacon, null=True, blank=True) beacon = models.ForeignKey(Beacon, null=True, blank=True)
from rest_framework import serializers from rest_framework import serializers
from App.loyaltyMe.models import Product, Offer, Promotion, Place, Localization, Beacon, Task from App.loyaltyMe.models import Product, Offer, Place, Localization, Beacon
from App.promotion.serializers import PromotionSetSerializer
class ProductSerializer(serializers.HyperlinkedModelSerializer): class ProductSerializer(serializers.HyperlinkedModelSerializer):
...@@ -17,20 +18,6 @@ class OfferSerializer(serializers.HyperlinkedModelSerializer): ...@@ -17,20 +18,6 @@ class OfferSerializer(serializers.HyperlinkedModelSerializer):
fields = ('url', 'id', 'products') fields = ('url', 'id', 'products')
class PromotionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Promotion
fields = ('url', 'id', 'name', 'description', 'code', 'img', 'status', 'left_number', 'start_date', 'end_date')
class PromotionSetSerializer(serializers.HyperlinkedModelSerializer):
promotions = PromotionSerializer(many=True)
class Meta:
model = Offer
fields = ('url', 'id', 'promotions')
class LocalizationSerializer(serializers.HyperlinkedModelSerializer): class LocalizationSerializer(serializers.HyperlinkedModelSerializer):
class Meta: class Meta:
model = Localization model = Localization
...@@ -55,9 +42,3 @@ class PlaceSerializer(serializers.HyperlinkedModelSerializer): ...@@ -55,9 +42,3 @@ class PlaceSerializer(serializers.HyperlinkedModelSerializer):
'url', 'id', 'name', 'type', 'screen_img', 'logo_img', 'description', 'offer', 'promotion', 'localization', 'url', 'id', 'name', 'type', 'screen_img', 'logo_img', 'description', 'offer', 'promotion', 'localization',
'beacon') 'beacon')
class TaskSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Task
fields = ('url', 'id', 'type', 'update_delay', 'description', 'name', 'counter_target', 'beacon_counter_target',
'counter_incrementation', 'beacon_signal_delay')
# Create your tests here.
from datetime import timedelta
from django.contrib.auth.models import User
from django.test import TestCase
from django.utils import timezone
from App.loyaltyMe.models import Task
from App.user.models import UserTask
class TaskTestCase(TestCase):
def setUp(self):
self.task = Task.objects.get_or_create(type="TM", update_delay=timedelta(seconds=10),
description="Test_description", name="test_name", counter_target=1,
beacon_counter_target=2, counter_incrementation=1,
beacon_signal_delay=timedelta(seconds=15),
beacon_singal_delay_maximum_delay=timedelta(seconds=300))[0]
def test_pass(self):
pass
class UserTaskTestCase(TestCase):
def setUp(self):
self.user = User.objects.get_or_create()[0]
self.task = Task.objects.get_or_create(type="TM", update_delay=timedelta(seconds=10),
description="Test_description", name="test_name", counter_target=1,
beacon_counter_target=2, counter_incrementation=1,
beacon_signal_delay=timedelta(seconds=15),
beacon_singal_delay_maximum_delay=timedelta(seconds=300))[0]
self.task.save()
beacon_signal_last_update = timezone.now() - timedelta(seconds=15)
self.user_task = UserTask.objects.get_or_create(task=self.task, user=self.user, done=False,
last_update=timezone.now(),
counter=0, beacon_counter=0,
beacon_signal_last_update=beacon_signal_last_update)[0]
self.user_task.save()
def set_data_beacon_singal_passed(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=15)
def set_data_task_signal_passed(self):
self.user_task.update_delay = timedelta(seconds=15)
self.user_task.last_update = timezone.now() - timedelta(seconds=20)
def set_data_maximum_beacon_singal_passed(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.task.beacon_singal_delay_maximum_delay = timedelta(seconds=300)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=305)
def test_maximum_delay_passed(self):
self.set_data_maximum_beacon_singal_passed()
self.assertFalse(self.user_task.ready_to_update())
def test_delay_passed(self):
signal_last_update = timezone.now() - timedelta(seconds=16)
signal_delay = timedelta(seconds=15)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertTrue(result)
def test_delay_passed_limit_value(self):
signal_last_update = timedelta(seconds=15)
signal_delay = timezone.now() - timedelta(seconds=15)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertTrue(result)
def test_delay_not_passed(self):
signal_last_update = timedelta(seconds=15)
signal_delay = timezone.now() - timedelta(seconds=14)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_increase(self):
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 1)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_not_increase(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=14)
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 2
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 0)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_reset(self):
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 0)
self.assertTrue(result)
def test_update_counter_increase(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 2
result = self.user_task.update()
self.assertEqual(self.user_task.counter, 1)
self.assertFalse(result)
def test_update_counter_not_increase(self):
self.set_data_beacon_singal_passed()
self.user_task.update_delay = timedelta(seconds=15)
self.user_task.last_update = timezone.now()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 2
result = self.user_task.update()
self.assertEqual(self.user_task.counter, 0)
self.assertFalse(result)
def test_update_task_done(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 1
result = self.user_task.update()
self.assertTrue(self.user_task.done)
self.assertTrue(result)
def test_update_test_not_ready_to_update(self):
self.user_task.signal_last_update = timedelta(seconds=15)
self.user_task.signal_delay = timezone.now() - timedelta(seconds=14)
result = self.user_task.update()
self.assertFalse(result)
def test_update_test_task_is_done(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 1
self.user_task.done = True
result = self.user_task.update()
self.assertFalse(result)
...@@ -4,10 +4,10 @@ from rest_framework import viewsets, permissions ...@@ -4,10 +4,10 @@ from rest_framework import viewsets, permissions
from rest_framework.decorators import detail_route from rest_framework.decorators import detail_route
from rest_framework.response import Response from rest_framework.response import Response
from App.loyaltyMe.models import Product, Offer, Promotion, Place, PromotionSet, Localization, Beacon, Task from App.loyaltyMe.models import Product, Offer, Place, Localization, Beacon
from App.loyaltyMe.serializers import ProductSerializer, OfferSerializer, PromotionSerializer, PlaceSerializer, \ from App.loyaltyMe.serializers import ProductSerializer, OfferSerializer, PlaceSerializer, \
PromotionSetSerializer, LocalizationSerializer, BeaconSerializer, TaskSerializer LocalizationSerializer, BeaconSerializer
from App.user.models import UserPromotion from App.promotion.models import UserPromotion
class ProductViewSet(viewsets.ModelViewSet): class ProductViewSet(viewsets.ModelViewSet):
...@@ -28,24 +28,6 @@ class OfferViewSet(viewsets.ModelViewSet): ...@@ -28,24 +28,6 @@ class OfferViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PromotionViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = Promotion.objects.all()
serializer_class = PromotionSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PromotionSetViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = PromotionSet.objects.all()
serializer_class = PromotionSetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PlaceViewSet(viewsets.ModelViewSet): class PlaceViewSet(viewsets.ModelViewSet):
""" """
API for articles API for articles
...@@ -64,7 +46,6 @@ class PlaceViewSet(viewsets.ModelViewSet): ...@@ -64,7 +46,6 @@ class PlaceViewSet(viewsets.ModelViewSet):
return Response(status=rest_framework.status.HTTP_200_OK) return Response(status=rest_framework.status.HTTP_200_OK)
class LocalizationViewSet(viewsets.ModelViewSet): class LocalizationViewSet(viewsets.ModelViewSet):
""" """
API for articles API for articles
...@@ -81,11 +62,3 @@ class BeaconViewSet(viewsets.ModelViewSet): ...@@ -81,11 +62,3 @@ class BeaconViewSet(viewsets.ModelViewSet):
queryset = Beacon.objects.all() queryset = Beacon.objects.all()
serializer_class = BeaconSerializer serializer_class = BeaconSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class TaskViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
\ No newline at end of file
<html>
{% load static from staticfiles %}
<head>
<link rel="stylesheet" type="text/css" href="static/css/main.css">
</head>
</html>
\ No newline at end of file
{% extends 'welcome_page/default/base.html' %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-sm-6 col-md-4 col-md-offset-4">
<div class="account-wall">
<img class="profile-img" src="{{STATIC_URL}}img/start-it.jpg"
alt="">
<form action="/login/" method="post" class="form-signin">
{% csrf_token %}
<input type="text" class="form-control" placeholder="Username" required autofocus name="username">
<input type="password" class="form-control" placeholder="Password" required name="password">
<button class="btn btn-lg btn-primary btn-block" type="submit">
Sign in</button>
<label class="checkbox pull-left">
<input type="checkbox" value="remember-me">
Remember me
</label>
<a href="#" class="pull-right need-help">Need help? </a><span class="clearfix"></span>
</form>
</div>
</div>
</div>
</div>
{% endblock content %}
\ No newline at end of file
...@@ -3,8 +3,11 @@ from django.shortcuts import render ...@@ -3,8 +3,11 @@ from django.shortcuts import render
# Create your views here. # Create your views here.
def coming_soon_page(request): def coming_soon_page(request):
return render(request, 'page/index.html', {}) return render(request, 'page/base.html', {})
def main_page(request): def main_page(request):
return render(request, 'main_page/index.html', {}) return render(request, 'main_page/base.html', {})
def login(request):
return render(request, 'panel/login.html', {})
\ No newline at end of file
from django.contrib import admin
# Register your models here.
from .models import Task
admin.site.register(Task)
\ No newline at end of file
from django.apps import AppConfig
class PromotionConfig(AppConfig):
name = 'promotion'
from datetime import datetime from datetime import datetime
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from App.loyaltyMe.models import Promotion, Task
from App.promotion.models import Task, Promotion
class Command(BaseCommand): class Command(BaseCommand):
......
from App.loyaltyMe.models import PromotionSet, Promotion
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from App.promotion.models import PromotionSet, Promotion
class Command(BaseCommand): class Command(BaseCommand):
help = 'Closes the specified poll for voting' help = 'Closes the specified poll for voting'
......
...@@ -2,7 +2,7 @@ from datetime import datetime, timedelta ...@@ -2,7 +2,7 @@ from datetime import datetime, timedelta
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from App.loyaltyMe.models import Task from App.promotion.models import Task
class Command(BaseCommand): class Command(BaseCommand):
......
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import Q from django.db.models import Q
from App.loyaltyMe.models import Place, Promotion, Task
from App.user.models import UserPromotion, UserTask
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from App.loyaltyMe.models import Place
from App.promotion.models import Promotion, UserTask, UserPromotion
from App.promotion.models import Task
class Command(BaseCommand): class Command(BaseCommand):
help = 'Closes the specified poll for voting' help = 'Closes the specified poll for voting'
......
import datetime
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.utils.timezone import is_naive, is_aware
from App.loyaltyMe.models import Task
from App.user.models import UserTask
from django.utils import timezone from django.utils import timezone
from App.promotion.models import Task, UserTask
class Command(BaseCommand): class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
...@@ -20,7 +16,6 @@ class Command(BaseCommand): ...@@ -20,7 +16,6 @@ class Command(BaseCommand):
print("Creating UsersTasks") print("Creating UsersTasks")
for user_task in data: for user_task in data:
print(is_aware(timezone.now()))
print("{1} take {0} Task".format(user_task[0], user_task[1])) print("{1} take {0} Task".format(user_task[0], user_task[1]))
task = Task.objects.filter(name=user_task[0])[0] task = Task.objects.filter(name=user_task[0])[0]
user = User.objects.filter(username=user_task[1])[0] user = User.objects.filter(username=user_task[1])[0]
......
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
from django.utils import timezone
from App.loyaltyMe.models import Place
class Task(models.Model):
TIME = 'TM'
PRESENCE = 'PR'
TYPE_CHOICES = (
(TIME, 'Time'),
(PRESENCE, 'Presence'),
)
type = models.CharField(max_length=2, choices=TYPE_CHOICES, default=PRESENCE)
update_delay = models.DurationField() # raz na dzień? Tego nie widzi usera
description = models.CharField(max_length=50)
name = models.CharField(max_length=50)
counter_target = models.IntegerField() #badz 10 razy #badz przez m # To widzi user #cel koncowy
counter_incrementation = models.IntegerField() # o 1 # Tego nie widzi user
beacon_counter_target = models.IntegerField() # 3x # 1x # tego nie widiz user
beacon_signal_delay = models.DurationField() # przez 5minut # co 5 minut #tego nie widzi user
beacon_singal_delay_maximum_delay = models.DurationField() # ale po 20 minutach sie restartuje
def __str__(self):
return self.name
class Promotion(models.Model):
AVAILABLE = 'AV'
NON_AVAILABLE = 'NAV'
STATUS_CHOICES = (
(AVAILABLE, 'Available'),
(NON_AVAILABLE, 'Non Available'),
)
name = models.CharField(max_length=50)
description = models.CharField(max_length=50)
code = models.CharField(max_length=50)
img = models.ImageField()
status = models.CharField(max_length=2, choices=STATUS_CHOICES, default=AVAILABLE)
task = models.ForeignKey(Task)
left_number = models.IntegerField(null=True)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
class PromotionSet(models.Model):
name = models.CharField(max_length=50)
promotions = models.ManyToManyField(Promotion, default='')
class UserTask(models.Model):
task = models.ForeignKey(Task)
user = models.ForeignKey(User, related_name='user_task',
blank=False, null=False, default=None)
done = models.BooleanField(default=False)
last_update = models.DateTimeField()
counter = models.IntegerField() # akutalnie bylem 3 razy # aktualny status uzytkwonika w zadaniu
beacon_counter = models.IntegerField() # juz 10 minut, jeszcze raz i bedzie hyvka # status czy zaliczyc z beaconow taska
beacon_signal_last_update = models.DateTimeField() # ostatnio 23 h temu # last update
def update(self):
if not self.ready_to_update():
return False
if self.done:
return False
if self.task_delay_passed():
self.counter += self.task.counter_incrementation
if self.counter == self.task.counter_target:
self.done = True
return True
return False
def ready_to_update(self):
if self.maximum_beacon_delay_passed():
self.beacon_counter = 0
if self.beacon_delay_passed():
self.beacon_counter = +1
self.beacon_signal_last_update = timezone.now()
if self.beacon_counter == self.task.beacon_counter_target:
self.beacon_counter = 0
return True
return False
def maximum_beacon_delay_passed(self):
return self.delay_passed(self.beacon_signal_last_update, self.task.beacon_singal_delay_maximum_delay)
def beacon_delay_passed(self):
return self.delay_passed(self.beacon_signal_last_update, self.task.beacon_signal_delay)
def task_delay_passed(self):
return self.delay_passed(self.last_update, self.task.update_delay)
def delay_passed(self, last_update, signal_delay):
actual_time = timezone.now()
time_difference = actual_time - last_update
return time_difference > signal_delay
class UserPromotion(models.Model):
USED = 'US'
ACTIVE = 'AC'
NON_AVAILABLE = 'NAV'
AVAILABLE = 'AV'
PROGRESS_CHOICES = (
(USED, 'Used'),
(ACTIVE, 'Active'),
(NON_AVAILABLE, 'Non Available'),
(AVAILABLE, 'Available'),
)
user = models.ForeignKey(User, related_name='user_promotion',
blank=False, null=False, default=None)
place = models.ForeignKey(Place)
promotion = models.ForeignKey(Promotion)
progress = models.CharField(max_length=2, choices=PROGRESS_CHOICES, default=ACTIVE)
code = models.CharField(max_length=20, null=True)
user_task = models.ForeignKey(UserTask)
def update_user_task(self):
self.user_task.update()
from rest_framework import serializers
from App.loyaltyMe.models import Offer
from App.promotion.models import Task, Promotion, UserTask, UserPromotion
from App.user.serializers import UserSerializer
class TaskSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Task
fields = ('url', 'id', 'type', 'update_delay', 'description', 'name', 'counter_target', 'beacon_counter_target',
'counter_incrementation', 'beacon_signal_delay')
class PromotionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Promotion
fields = ('url', 'id', 'name', 'description', 'code', 'img', 'status', 'left_number', 'start_date', 'end_date')
class PromotionSetSerializer(serializers.HyperlinkedModelSerializer):
promotions = PromotionSerializer(many=True)
class Meta:
model = Offer
fields = ('url', 'id', 'promotions')
class UserPromotionSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer()
promotion = PromotionSerializer()
class Meta:
model = UserPromotion
fields = ('url', 'id', 'user', 'place', 'promotion', 'progress', 'code')
class UserTaskSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer()
task = TaskSerializer()
last_update = serializers.DateTimeField(format="%Y-%m-%dT%H:%M:%S")
beacon_signal_last_update = serializers.DateTimeField(format="%Y-%m-%dT%H:%M:%S")
class Meta:
model = UserTask
fields = ('url', 'id', 'task', 'user', 'done', 'last_update', 'counter', 'beacon_counter', 'beacon_signal_last_update')
# Create your tests here.
from datetime import timedelta
from django.contrib.auth.models import User
from django.test import TestCase
from django.utils import timezone
from App.promotion.models import Task, UserTask
class TaskTestCase(TestCase):
def setUp(self):
self.task = Task.objects.get_or_create(type="TM", update_delay=timedelta(seconds=10),
description="Test_description", name="test_name", counter_target=1,
beacon_counter_target=2, counter_incrementation=1,
beacon_signal_delay=timedelta(seconds=15),
beacon_singal_delay_maximum_delay=timedelta(seconds=300))[0]
def test_pass(self):
pass
class UserTaskTestCase(TestCase):
def setUp(self):
self.user = User.objects.get_or_create()[0]
self.task = Task.objects.get_or_create(type="TM", update_delay=timedelta(seconds=10),
description="Test_description", name="test_name", counter_target=1,
beacon_counter_target=2, counter_incrementation=1,
beacon_signal_delay=timedelta(seconds=15),
beacon_singal_delay_maximum_delay=timedelta(seconds=300))[0]
self.task.save()
beacon_signal_last_update = timezone.now() - timedelta(seconds=15)
self.user_task = UserTask.objects.get_or_create(task=self.task, user=self.user, done=False,
last_update=timezone.now(),
counter=0, beacon_counter=0,
beacon_signal_last_update=beacon_signal_last_update)[0]
self.user_task.save()
def set_data_beacon_singal_passed(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=15)
def set_data_task_signal_passed(self):
self.user_task.update_delay = timedelta(seconds=15)
self.user_task.last_update = timezone.now() - timedelta(seconds=20)
def set_data_maximum_beacon_singal_passed(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.task.beacon_singal_delay_maximum_delay = timedelta(seconds=300)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=305)
def test_maximum_delay_passed(self):
self.set_data_maximum_beacon_singal_passed()
self.assertFalse(self.user_task.ready_to_update())
def test_delay_passed(self):
signal_last_update = timezone.now() - timedelta(seconds=16)
signal_delay = timedelta(seconds=15)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertTrue(result)
def test_delay_passed_limit_value(self):
signal_last_update = timedelta(seconds=15)
signal_delay = timezone.now() - timedelta(seconds=15)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertTrue(result)
def test_delay_not_passed(self):
signal_last_update = timedelta(seconds=15)
signal_delay = timezone.now() - timedelta(seconds=14)
result = self.user_task.delay_passed(signal_last_update, signal_delay)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_increase(self):
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 1)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_not_increase(self):
self.user_task.task.beacon_signal_delay = timedelta(seconds=15)
self.user_task.beacon_signal_last_update = timezone.now() - timedelta(seconds=14)
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 2
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 0)
self.assertFalse(result)
def test_ready_to_update_beacon_counter_reset(self):
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
result = self.user_task.ready_to_update()
self.assertEqual(self.user_task.beacon_counter, 0)
self.assertTrue(result)
def test_update_counter_increase(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 2
result = self.user_task.update()
self.assertEqual(self.user_task.counter, 1)
self.assertFalse(result)
def test_update_counter_not_increase(self):
self.set_data_beacon_singal_passed()
self.user_task.update_delay = timedelta(seconds=15)
self.user_task.last_update = timezone.now()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 2
result = self.user_task.update()
self.assertEqual(self.user_task.counter, 0)
self.assertFalse(result)
def test_update_task_done(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 1
result = self.user_task.update()
self.assertTrue(self.user_task.done)
self.assertTrue(result)
def test_update_test_not_ready_to_update(self):
self.user_task.signal_last_update = timedelta(seconds=15)
self.user_task.signal_delay = timezone.now() - timedelta(seconds=14)
result = self.user_task.update()
self.assertFalse(result)
def test_update_test_task_is_done(self):
self.set_data_task_signal_passed()
self.set_data_beacon_singal_passed()
self.user_task.beacon_counter = 0
self.user_task.task.beacon_counter_target = 1
self.user_task.counter = 0
self.user_task.task.counter_target = 1
self.user_task.done = True
result = self.user_task.update()
self.assertFalse(result)
from django.test import TestCase
# Create your tests here.
import django_filters
from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets, permissions, filters
from rest_framework.decorators import api_view
from rest_framework.decorators import renderer_classes
from rest_framework_swagger.renderers import SwaggerUIRenderer, OpenAPIRenderer
from rest_framework import response, schemas
from App.promotion.models import UserPromotion, UserTask, Promotion, PromotionSet, Task
from App.promotion.serializers import UserTaskSerializer, UserPromotionSerializer, PromotionSerializer, \
PromotionSetSerializer, TaskSerializer
class UserPromotionFilter(filters.FilterSet):
place = django_filters.CharFilter(name="place__id")
class Meta:
model = UserPromotion
fields = ['place']
class UserPromotionViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = UserPromotion.objects.all()
serializer_class = UserPromotionSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.DjangoFilterBackend,)
filter_class = UserPromotionFilter
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return UserPromotion.objects.filter(user=user)
class UserTaskViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = UserTask.objects.all()
serializer_class = UserTaskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.DjangoFilterBackend,)
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return UserTask.objects.filter(user=user)
class PromotionViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = Promotion.objects.all()
serializer_class = PromotionSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class PromotionSetViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = PromotionSet.objects.all()
serializer_class = PromotionSetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class TaskViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = Task.objects.all()
serializer_class = TaskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
from datetime import timedelta, datetime
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from django.test import TestCase
# Create your models here. # Create your models here.
from App.loyaltyMe.models import Place, Promotion, Task
from django.utils import timezone
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
...@@ -21,76 +18,3 @@ class UserProfile(models.Model): ...@@ -21,76 +18,3 @@ class UserProfile(models.Model):
user = models.ForeignKey(User, related_name='user_profile', user = models.ForeignKey(User, related_name='user_profile',
blank=False, null=False, default=None) blank=False, null=False, default=None)
photo = models.ImageField() photo = models.ImageField()
class UserTask(models.Model):
task = models.ForeignKey(Task)
user = models.ForeignKey(User, related_name='user_task',
blank=False, null=False, default=None)
done = models.BooleanField(default=False)
last_update = models.DateTimeField()
counter = models.IntegerField() # akutalnie bylem 3 razy # aktualny status uzytkwonika w zadaniu
beacon_counter = models.IntegerField() # juz 10 minut, jeszcze raz i bedzie hyvka # status czy zaliczyc z beaconow taska
beacon_signal_last_update = models.DateTimeField() # ostatnio 23 h temu # last update
def update(self):
if not self.ready_to_update():
return False
if self.done:
return False
if self.task_delay_passed():
self.counter += self.task.counter_incrementation
if self.counter == self.task.counter_target:
self.done = True
return True
return False
def ready_to_update(self):
if self.maximum_beacon_delay_passed():
self.beacon_counter = 0
if self.beacon_delay_passed():
self.beacon_counter = +1
self.beacon_signal_last_update = timezone.now()
if self.beacon_counter == self.task.beacon_counter_target:
self.beacon_counter = 0
return True
return False
def maximum_beacon_delay_passed(self):
return self.delay_passed(self.beacon_signal_last_update, self.task.beacon_singal_delay_maximum_delay)
def beacon_delay_passed(self):
return self.delay_passed(self.beacon_signal_last_update, self.task.beacon_signal_delay)
def task_delay_passed(self):
return self.delay_passed(self.last_update, self.task.update_delay)
def delay_passed(self, last_update, signal_delay):
actual_time = timezone.now()
time_difference = actual_time - last_update
return time_difference > signal_delay
class UserPromotion(models.Model):
USED = 'US'
ACTIVE = 'AC'
NON_AVAILABLE = 'NAV'
AVAILABLE = 'AV'
PROGRESS_CHOICES = (
(USED, 'Used'),
(ACTIVE, 'Active'),
(NON_AVAILABLE, 'Non Available'),
(AVAILABLE, 'Available'),
)
user = models.ForeignKey(User, related_name='user_promotion',
blank=False, null=False, default=None)
place = models.ForeignKey(Place)
promotion = models.ForeignKey(Promotion)
progress = models.CharField(max_length=2, choices=PROGRESS_CHOICES, default=ACTIVE)
code = models.CharField(max_length=20, null=True)
user_task = models.ForeignKey(UserTask)
def update_user_task(self):
self.user_task.update()
...@@ -3,8 +3,7 @@ from django.contrib.auth.models import User ...@@ -3,8 +3,7 @@ from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from App.loyaltyMe.serializers import PromotionSerializer, TaskSerializer from App.user.models import UserProfile
from App.user.models import UserProfile, UserPromotion, UserTask
class UserSerializer(serializers.HyperlinkedModelSerializer): class UserSerializer(serializers.HyperlinkedModelSerializer):
...@@ -21,18 +20,6 @@ class UserProfileSerializer(serializers.HyperlinkedModelSerializer): ...@@ -21,18 +20,6 @@ class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
fields = ('url', 'id', 'user', 'photo') fields = ('url', 'id', 'user', 'photo')
class UserTaskSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer()
task = TaskSerializer()
last_update = serializers.DateTimeField(format="%Y-%m-%dT%H:%M:%S")
beacon_signal_last_update = serializers.DateTimeField(format="%Y-%m-%dT%H:%M:%S")
class Meta:
model = UserTask
fields = ('url', 'id', 'task', 'user', 'done', 'last_update', 'counter', 'beacon_counter', 'beacon_signal_last_update')
class AuthTokenSerializerByEmail(serializers.Serializer): class AuthTokenSerializerByEmail(serializers.Serializer):
email = serializers.CharField(label=_("Email")) email = serializers.CharField(label=_("Email"))
password = serializers.CharField(label=_("Password"), style={'input_type': 'password'}) password = serializers.CharField(label=_("Password"), style={'input_type': 'password'})
...@@ -61,12 +48,3 @@ class AuthTokenSerializerByEmail(serializers.Serializer): ...@@ -61,12 +48,3 @@ class AuthTokenSerializerByEmail(serializers.Serializer):
attrs['user'] = user attrs['user'] = user
return attrs return attrs
class UserPromotionSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer()
promotion = PromotionSerializer()
class Meta:
model = UserPromotion
fields = ('url', 'id', 'user', 'place', 'promotion', 'progress', 'code')
\ No newline at end of file
...@@ -13,9 +13,8 @@ from rest_framework.views import APIView ...@@ -13,9 +13,8 @@ from rest_framework.views import APIView
from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer from rest_framework_swagger.renderers import OpenAPIRenderer, SwaggerUIRenderer
from rest_framework import response, schemas from rest_framework import response, schemas
from App.user.models import UserProfile, UserPromotion, UserTask from App.user.models import UserProfile
from App.user.serializers import UserSerializer, AuthTokenSerializerByEmail, UserProfileSerializer, \ from App.user.serializers import UserSerializer, AuthTokenSerializerByEmail, UserProfileSerializer
UserPromotionSerializer, UserTaskSerializer
from rest_framework import parsers, renderers from rest_framework import parsers, renderers
...@@ -85,52 +84,11 @@ class ObtainAuthToken(APIView): ...@@ -85,52 +84,11 @@ class ObtainAuthToken(APIView):
obtain_auth_token = ObtainAuthToken.as_view() obtain_auth_token = ObtainAuthToken.as_view()
class UserPromotionFilter(filters.FilterSet):
place = django_filters.CharFilter(name="place__id")
class Meta:
model = UserPromotion
fields = ['place']
class UserPromotionViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = UserPromotion.objects.all()
serializer_class = UserPromotionSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.DjangoFilterBackend,)
filter_class = UserPromotionFilter
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return UserPromotion.objects.filter(user=user)
class UserTaskViewSet(viewsets.ModelViewSet):
"""
API for articles
"""
queryset = UserTask.objects.all()
serializer_class = UserTaskSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.DjangoFilterBackend,)
def get_queryset(self):
"""
This view should return a list of all the purchases
for the currently authenticated user.
"""
user = self.request.user
return UserTask.objects.filter(user=user)
@api_view() @api_view()
@renderer_classes([OpenAPIRenderer, SwaggerUIRenderer]) @renderer_classes([OpenAPIRenderer, SwaggerUIRenderer])
def schema_view(request): def schema_view(request):
generator = schemas.SchemaGenerator(title='Bookings API') generator = schemas.SchemaGenerator(title='Bookings API')
return response.Response(generator.get_schema(request=request)) return response.Response(generator.get_schema(request=request))
...@@ -41,6 +41,7 @@ INSTALLED_APPS = [ ...@@ -41,6 +41,7 @@ INSTALLED_APPS = [
'rest_framework_swagger', 'rest_framework_swagger',
'rest_framework.authtoken', 'rest_framework.authtoken',
'App.user', 'App.user',
'App.promotion',
'App.page', 'App.page',
'App.loyaltyMe', 'App.loyaltyMe',
] ]
......
...@@ -18,29 +18,31 @@ from django.contrib import admin ...@@ -18,29 +18,31 @@ from django.contrib import admin
from rest_framework import routers from rest_framework import routers
from App.loyaltyMe import views as loyalty_views from App.loyaltyMe import views as loyalty_views
from App.page.views import coming_soon_page, main_page from App.page.views import coming_soon_page, main_page, login
from App.user import views as user_views from App.user import views as user_views
from App.promotion import views as promotion_views
from App.user.views import schema_view from App.user.views import schema_view
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'user', user_views.UserViewSet) router.register(r'user', user_views.UserViewSet)
router.register(r'user_profile', user_views.UserProfileViewSet) router.register(r'user_profile', user_views.UserProfileViewSet)
router.register(r'user_promotions', user_views.UserPromotionViewSet) router.register(r'user_promotions', promotion_views.UserPromotionViewSet)
router.register(r'user_tasks', user_views.UserTaskViewSet) router.register(r'user_tasks', promotion_views.UserTaskViewSet)
router.register(r'products', loyalty_views.ProductViewSet) router.register(r'products', loyalty_views.ProductViewSet)
router.register(r'offers', loyalty_views.OfferViewSet) router.register(r'offers', loyalty_views.OfferViewSet)
router.register(r'promotions', loyalty_views.PromotionViewSet) router.register(r'promotions', promotion_views.PromotionViewSet)
router.register(r'promotion_set', loyalty_views.PromotionSetViewSet) router.register(r'promotion_set', promotion_views.PromotionSetViewSet)
router.register(r'places', loyalty_views.PlaceViewSet) router.register(r'places', loyalty_views.PlaceViewSet)
router.register(r'localizations', loyalty_views.LocalizationViewSet) router.register(r'localizations', loyalty_views.LocalizationViewSet)
router.register(r'beacons', loyalty_views.BeaconViewSet) router.register(r'beacons', loyalty_views.BeaconViewSet)
router.register(r'tasks', loyalty_views.TaskViewSet) router.register(r'tasks', promotion_views.TaskViewSet)
urlpatterns = [ urlpatterns = [
url(r'^api/', include(router.urls)), url(r'^api/', include(router.urls)),
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^$', coming_soon_page, name='post_list'), url(r'^$', coming_soon_page, name='post_list'),
url(r'^main/$', main_page, name='post_list'), url(r'^main/$', main_page, name='post_list'),
url(r'^login/$', login, name='post_list'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', user_views.obtain_auth_token), url(r'^api-token-auth/', user_views.obtain_auth_token),
url(r'^docs/', schema_view), url(r'^docs/', schema_view),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment