Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
K
KawowyDzienniczek
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Rafal
KawowyDzienniczek
Commits
fa8d9f9a
Commit
fa8d9f9a
authored
Jul 27, 2016
by
lizonr1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split loyaltyMe into loyaltyMe and promotion apps
parent
75418b96
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
510 additions
and
427 deletions
+510
-427
admin.py
KawowyDzienniczek/App/loyaltyMe/admin.py
+0
-4
init_places.py
...enniczek/App/loyaltyMe/management/commands/init_places.py
+2
-1
models.py
KawowyDzienniczek/App/loyaltyMe/models.py
+3
-48
serializers.py
KawowyDzienniczek/App/loyaltyMe/serializers.py
+2
-21
test_models.py
KawowyDzienniczek/App/loyaltyMe/test_models.py
+0
-155
views.py
KawowyDzienniczek/App/loyaltyMe/views.py
+4
-31
base.html
KawowyDzienniczek/App/page/templates/main_page/base.html
+0
-0
base.html
KawowyDzienniczek/App/page/templates/page/base.html
+0
-0
base.html
KawowyDzienniczek/App/page/templates/panel/base.html
+6
-0
login.html
KawowyDzienniczek/App/page/templates/panel/login.html
+28
-0
views.py
KawowyDzienniczek/App/page/views.py
+5
-2
__init__.py
KawowyDzienniczek/App/promotion/__init__.py
+0
-0
admin.py
KawowyDzienniczek/App/promotion/admin.py
+6
-0
apps.py
KawowyDzienniczek/App/promotion/apps.py
+5
-0
__init__.py
KawowyDzienniczek/App/promotion/management/__init__.py
+0
-0
__init__.py
...Dzienniczek/App/promotion/management/commands/__init__.py
+0
-0
init_promotions.py
...czek/App/promotion/management/commands/init_promotions.py
+2
-1
init_promotionsets.py
...k/App/promotion/management/commands/init_promotionsets.py
+2
-1
init_tasks.py
...ienniczek/App/promotion/management/commands/init_tasks.py
+1
-1
init_userpromotions.py
.../App/promotion/management/commands/init_userpromotions.py
+4
-2
init_usertasks.py
...iczek/App/promotion/management/commands/init_usertasks.py
+2
-7
__init__.py
KawowyDzienniczek/App/promotion/migrations/__init__.py
+0
-0
models.py
KawowyDzienniczek/App/promotion/models.py
+128
-0
serializers.py
KawowyDzienniczek/App/promotion/serializers.py
+52
-0
test_models.py
KawowyDzienniczek/App/promotion/test_models.py
+154
-0
tests.py
KawowyDzienniczek/App/promotion/tests.py
+3
-0
views.py
KawowyDzienniczek/App/promotion/views.py
+85
-0
models.py
KawowyDzienniczek/App/user/models.py
+2
-78
serializers.py
KawowyDzienniczek/App/user/serializers.py
+1
-23
views.py
KawowyDzienniczek/App/user/views.py
+4
-46
base.py
KawowyDzienniczek/config/settings/base.py
+1
-0
urls.py
KawowyDzienniczek/config/urls.py
+8
-6
No files found.
KawowyDzienniczek/App/loyaltyMe/admin.py
View file @
fa8d9f9a
# Register your models here.
from
django.contrib
import
admin
from
App.loyaltyMe.models
import
Task
admin
.
site
.
register
(
Task
)
\ No newline at end of file
KawowyDzienniczek/App/loyaltyMe/management/commands/init_places.py
View file @
fa8d9f9a
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
):
...
...
KawowyDzienniczek/App/loyaltyMe/models.py
View file @
fa8d9f9a
from
django.db
import
models
# Create your models here.
class
Product
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
50
)
description
=
models
.
CharField
(
max_length
=
50
)
...
...
@@ -15,53 +17,6 @@ class Offer(models.Model):
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
):
latitude
=
models
.
CharField
(
max_length
=
50
,
)
longitude
=
models
.
CharField
(
max_length
=
50
,
)
...
...
@@ -85,6 +40,6 @@ class Place(models.Model):
logo_img
=
models
.
ImageField
()
description
=
models
.
CharField
(
max_length
=
50
)
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
)
beacon
=
models
.
ForeignKey
(
Beacon
,
null
=
True
,
blank
=
True
)
KawowyDzienniczek/App/loyaltyMe/serializers.py
View file @
fa8d9f9a
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
):
...
...
@@ -17,20 +18,6 @@ class OfferSerializer(serializers.HyperlinkedModelSerializer):
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
Meta
:
model
=
Localization
...
...
@@ -55,9 +42,3 @@ class PlaceSerializer(serializers.HyperlinkedModelSerializer):
'url'
,
'id'
,
'name'
,
'type'
,
'screen_img'
,
'logo_img'
,
'description'
,
'offer'
,
'promotion'
,
'localization'
,
'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'
)
KawowyDzienniczek/App/loyaltyMe/test_models.py
View file @
fa8d9f9a
# 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
)
KawowyDzienniczek/App/loyaltyMe/views.py
View file @
fa8d9f9a
...
...
@@ -4,10 +4,10 @@ from rest_framework import viewsets, permissions
from
rest_framework.decorators
import
detail_route
from
rest_framework.response
import
Response
from
App.loyaltyMe.models
import
Product
,
Offer
,
P
romotion
,
Place
,
PromotionSet
,
Localization
,
Beacon
,
Task
from
App.loyaltyMe.serializers
import
ProductSerializer
,
OfferSerializer
,
P
romotionSerializer
,
P
laceSerializer
,
\
PromotionSetSerializer
,
LocalizationSerializer
,
BeaconSerializer
,
Task
Serializer
from
App.
user
.models
import
UserPromotion
from
App.loyaltyMe.models
import
Product
,
Offer
,
P
lace
,
Localization
,
Beacon
from
App.loyaltyMe.serializers
import
ProductSerializer
,
OfferSerializer
,
PlaceSerializer
,
\
LocalizationSerializer
,
Beacon
Serializer
from
App.
promotion
.models
import
UserPromotion
class
ProductViewSet
(
viewsets
.
ModelViewSet
):
...
...
@@ -28,24 +28,6 @@ class OfferViewSet(viewsets.ModelViewSet):
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
):
"""
API for articles
...
...
@@ -64,7 +46,6 @@ class PlaceViewSet(viewsets.ModelViewSet):
return
Response
(
status
=
rest_framework
.
status
.
HTTP_200_OK
)
class
LocalizationViewSet
(
viewsets
.
ModelViewSet
):
"""
API for articles
...
...
@@ -81,11 +62,3 @@ class BeaconViewSet(viewsets.ModelViewSet):
queryset
=
Beacon
.
objects
.
all
()
serializer_class
=
BeaconSerializer
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
KawowyDzienniczek/App/page/templates/main_page/
index
.html
→
KawowyDzienniczek/App/page/templates/main_page/
base
.html
View file @
fa8d9f9a
File moved
KawowyDzienniczek/App/page/templates/page/
index
.html
→
KawowyDzienniczek/App/page/templates/page/
base
.html
View file @
fa8d9f9a
File moved
KawowyDzienniczek/App/page/templates/panel/base.html
0 → 100644
View file @
fa8d9f9a
<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
KawowyDzienniczek/App/page/templates/panel/login.html
0 → 100644
View file @
fa8d9f9a
{% 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
KawowyDzienniczek/App/page/views.py
View file @
fa8d9f9a
...
...
@@ -3,8 +3,11 @@ from django.shortcuts import render
# Create your views here.
def
coming_soon_page
(
request
):
return
render
(
request
,
'page/
index
.html'
,
{})
return
render
(
request
,
'page/
base
.html'
,
{})
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
KawowyDzienniczek/App/promotion/__init__.py
0 → 100644
View file @
fa8d9f9a
KawowyDzienniczek/App/promotion/admin.py
0 → 100644
View file @
fa8d9f9a
from
django.contrib
import
admin
# Register your models here.
from
.models
import
Task
admin
.
site
.
register
(
Task
)
\ No newline at end of file
KawowyDzienniczek/App/promotion/apps.py
0 → 100644
View file @
fa8d9f9a
from
django.apps
import
AppConfig
class
PromotionConfig
(
AppConfig
):
name
=
'promotion'
KawowyDzienniczek/App/promotion/management/__init__.py
0 → 100644
View file @
fa8d9f9a
KawowyDzienniczek/App/promotion/management/commands/__init__.py
0 → 100644
View file @
fa8d9f9a
KawowyDzienniczek/App/
loyaltyMe
/management/commands/init_promotions.py
→
KawowyDzienniczek/App/
promotion
/management/commands/init_promotions.py
View file @
fa8d9f9a
from
datetime
import
datetime
from
django.core.management.base
import
BaseCommand
from
App.loyaltyMe.models
import
Promotion
,
Task
from
App.promotion.models
import
Task
,
Promotion
class
Command
(
BaseCommand
):
...
...
KawowyDzienniczek/App/
loyaltyMe
/management/commands/init_promotionsets.py
→
KawowyDzienniczek/App/
promotion
/management/commands/init_promotionsets.py
View file @
fa8d9f9a
from
App.loyaltyMe.models
import
PromotionSet
,
Promotion
from
django.core.management.base
import
BaseCommand
from
App.promotion.models
import
PromotionSet
,
Promotion
class
Command
(
BaseCommand
):
help
=
'Closes the specified poll for voting'
...
...
KawowyDzienniczek/App/
loyaltyMe
/management/commands/init_tasks.py
→
KawowyDzienniczek/App/
promotion
/management/commands/init_tasks.py
View file @
fa8d9f9a
...
...
@@ -2,7 +2,7 @@ from datetime import datetime, timedelta
from
django.core.management.base
import
BaseCommand
from
App.
loyaltyMe
.models
import
Task
from
App.
promotion
.models
import
Task
class
Command
(
BaseCommand
):
...
...
KawowyDzienniczek/App/
user
/management/commands/init_userpromotions.py
→
KawowyDzienniczek/App/
promotion
/management/commands/init_userpromotions.py
View file @
fa8d9f9a
from
django.contrib.auth.models
import
User
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
App.loyaltyMe.models
import
Place
from
App.promotion.models
import
Promotion
,
UserTask
,
UserPromotion
from
App.promotion.models
import
Task
class
Command
(
BaseCommand
):
help
=
'Closes the specified poll for voting'
...
...
KawowyDzienniczek/App/
user
/management/commands/init_usertasks.py
→
KawowyDzienniczek/App/
promotion
/management/commands/init_usertasks.py
View file @
fa8d9f9a
import
datetime
from
django.contrib.auth.models
import
User
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
App.promotion.models
import
Task
,
UserTask
class
Command
(
BaseCommand
):
def
handle
(
self
,
*
args
,
**
options
):
...
...
@@ -20,7 +16,6 @@ class Command(BaseCommand):
print
(
"Creating UsersTasks"
)
for
user_task
in
data
:
print
(
is_aware
(
timezone
.
now
()))
print
(
"{1} take {0} Task"
.
format
(
user_task
[
0
],
user_task
[
1
]))
task
=
Task
.
objects
.
filter
(
name
=
user_task
[
0
])[
0
]
user
=
User
.
objects
.
filter
(
username
=
user_task
[
1
])[
0
]
...
...
KawowyDzienniczek/App/promotion/migrations/__init__.py
0 → 100644
View file @
fa8d9f9a
KawowyDzienniczek/App/promotion/models.py
0 → 100644
View file @
fa8d9f9a
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
()
KawowyDzienniczek/App/promotion/serializers.py
0 → 100644
View file @
fa8d9f9a
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'
)
KawowyDzienniczek/App/promotion/test_models.py
0 → 100644
View file @
fa8d9f9a
# 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
)
KawowyDzienniczek/App/promotion/tests.py
0 → 100644
View file @
fa8d9f9a
from
django.test
import
TestCase
# Create your tests here.
KawowyDzienniczek/App/promotion/views.py
0 → 100644
View file @
fa8d9f9a
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
,)
KawowyDzienniczek/App/user/models.py
View file @
fa8d9f9a
from
datetime
import
timedelta
,
datetime
from
django.contrib.auth.models
import
User
from
django.db
import
models
from
django.db.models.signals
import
post_save
from
django.dispatch
import
receiver
from
rest_framework.authtoken.models
import
Token
from
django.test
import
TestCase
# Create your models here.
from
App.loyaltyMe.models
import
Place
,
Promotion
,
Task
from
django.utils
import
timezone
@
receiver
(
post_save
,
sender
=
User
)
...
...
@@ -21,76 +18,3 @@ class UserProfile(models.Model):
user
=
models
.
ForeignKey
(
User
,
related_name
=
'user_profile'
,
blank
=
False
,
null
=
False
,
default
=
None
)
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
()
KawowyDzienniczek/App/user/serializers.py
View file @
fa8d9f9a
...
...
@@ -3,8 +3,7 @@ from django.contrib.auth.models import User
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework
import
serializers
from
App.loyaltyMe.serializers
import
PromotionSerializer
,
TaskSerializer
from
App.user.models
import
UserProfile
,
UserPromotion
,
UserTask
from
App.user.models
import
UserProfile
class
UserSerializer
(
serializers
.
HyperlinkedModelSerializer
):
...
...
@@ -21,18 +20,6 @@ class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
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
):
email
=
serializers
.
CharField
(
label
=
_
(
"Email"
))
password
=
serializers
.
CharField
(
label
=
_
(
"Password"
),
style
=
{
'input_type'
:
'password'
})
...
...
@@ -61,12 +48,3 @@ class AuthTokenSerializerByEmail(serializers.Serializer):
attrs
[
'user'
]
=
user
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
KawowyDzienniczek/App/user/views.py
View file @
fa8d9f9a
...
...
@@ -13,9 +13,8 @@ from rest_framework.views import APIView
from
rest_framework_swagger.renderers
import
OpenAPIRenderer
,
SwaggerUIRenderer
from
rest_framework
import
response
,
schemas
from
App.user.models
import
UserProfile
,
UserPromotion
,
UserTask
from
App.user.serializers
import
UserSerializer
,
AuthTokenSerializerByEmail
,
UserProfileSerializer
,
\
UserPromotionSerializer
,
UserTaskSerializer
from
App.user.models
import
UserProfile
from
App.user.serializers
import
UserSerializer
,
AuthTokenSerializerByEmail
,
UserProfileSerializer
from
rest_framework
import
parsers
,
renderers
...
...
@@ -85,52 +84,11 @@ class ObtainAuthToken(APIView):
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
()
@
renderer_classes
([
OpenAPIRenderer
,
SwaggerUIRenderer
])
def
schema_view
(
request
):
generator
=
schemas
.
SchemaGenerator
(
title
=
'Bookings API'
)
return
response
.
Response
(
generator
.
get_schema
(
request
=
request
))
KawowyDzienniczek/config/settings/base.py
View file @
fa8d9f9a
...
...
@@ -41,6 +41,7 @@ INSTALLED_APPS = [
'rest_framework_swagger'
,
'rest_framework.authtoken'
,
'App.user'
,
'App.promotion'
,
'App.page'
,
'App.loyaltyMe'
,
]
...
...
KawowyDzienniczek/config/urls.py
View file @
fa8d9f9a
...
...
@@ -18,29 +18,31 @@ from django.contrib import admin
from
rest_framework
import
routers
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.promotion
import
views
as
promotion_views
from
App.user.views
import
schema_view
router
=
routers
.
DefaultRouter
()
router
.
register
(
r'user'
,
user_views
.
UserViewSet
)
router
.
register
(
r'user_profile'
,
user_views
.
UserProfileViewSet
)
router
.
register
(
r'user_promotions'
,
user
_views
.
UserPromotionViewSet
)
router
.
register
(
r'user_tasks'
,
user
_views
.
UserTaskViewSet
)
router
.
register
(
r'user_promotions'
,
promotion
_views
.
UserPromotionViewSet
)
router
.
register
(
r'user_tasks'
,
promotion
_views
.
UserTaskViewSet
)
router
.
register
(
r'products'
,
loyalty_views
.
ProductViewSet
)
router
.
register
(
r'offers'
,
loyalty_views
.
OfferViewSet
)
router
.
register
(
r'promotions'
,
loyalty
_views
.
PromotionViewSet
)
router
.
register
(
r'promotion_set'
,
loyalty
_views
.
PromotionSetViewSet
)
router
.
register
(
r'promotions'
,
promotion
_views
.
PromotionViewSet
)
router
.
register
(
r'promotion_set'
,
promotion
_views
.
PromotionSetViewSet
)
router
.
register
(
r'places'
,
loyalty_views
.
PlaceViewSet
)
router
.
register
(
r'localizations'
,
loyalty_views
.
LocalizationViewSet
)
router
.
register
(
r'beacons'
,
loyalty_views
.
BeaconViewSet
)
router
.
register
(
r'tasks'
,
loyalty
_views
.
TaskViewSet
)
router
.
register
(
r'tasks'
,
promotion
_views
.
TaskViewSet
)
urlpatterns
=
[
url
(
r'^api/'
,
include
(
router
.
urls
)),
url
(
r'^admin/'
,
include
(
admin
.
site
.
urls
)),
url
(
r'^$'
,
coming_soon_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-token-auth/'
,
user_views
.
obtain_auth_token
),
url
(
r'^docs/'
,
schema_view
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment