Commit 795f84f4 authored by lizonr1's avatar lizonr1

Add panel view and promotions sets

parent 1b09c20d
...@@ -6,6 +6,7 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka. ...@@ -6,6 +6,7 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka.
<HR> <HR>
<a href="/place">Twoje kawiarnie</a><BR> <a href="/place">Twoje kawiarnie</a><BR>
<a href="/beacon">Twoje beacony</a><BR> <a href="/beacon">Twoje beacony</a><BR>
<a href="/user/{{ user.user_profile.get.id }}">Twój profil</a><BR>
<BR><hr> <BR><hr>
<a href="/logout">Logout</a> <a href="/logout">Logout</a>
......
...@@ -7,14 +7,17 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka. ...@@ -7,14 +7,17 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka.
{{ place.name }} <BR> {{ place.name }} <BR>
{{ place.type }} <BR> {{ place.type }} <BR>
<img src="{{ place.screen_img }}"> <BR>
<img src="{{ place.logo_img }}"> <BR>
{{ place.description }} <BR> {{ place.description }} <BR>
{{ place.offer }} <BR> {{ place.offer }} <BR>
{{ place.promotion }} <BR> {% for promotion in place.promotion.all %}
<a href="/promotion_set/{{ promotion.id }}">{{ promotion.name }}</a><BR>
{% endfor %}
<a href="./promotion_set/add">Dodaj liste promocji</a><BR>
{{ place.localization }} <BR> {{ place.localization }} <BR>
{{ place.beacon }} <BR> {{ place.beacon }} <BR>
<img src="{{ place.screen_img }}"> <BR>
<img src="{{ place.logo_img }}"> <BR>
<BR><hr> <BR><hr>
<a href="/place">Wróć</a><BR> <a href="/place">Wróć</a><BR>
......
...@@ -10,6 +10,7 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka. ...@@ -10,6 +10,7 @@ Witaj {{ user }} w panelu Kawowego Dzienniczka.
{% endfor %} {% endfor %}
<BR><hr> <BR><hr>
<a href="/place/add">Dodaj kawiarnie</a><BR>
<a href="/panel">Panel</a> <a href="/panel">Panel</a>
<BR> <BR>
......
from django.contrib.auth import login, logout from django.contrib.auth import login, logout
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse from django.contrib.auth.models import User
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views import generic from django.views import generic
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.generic import FormView, View, DetailView, ListView, CreateView, UpdateView from django.views.generic import FormView, View, DetailView, ListView, CreateView, UpdateView, DeleteView
from django.views.generic.base import TemplateResponseMixin from django.views.generic.base import TemplateResponseMixin
from App.loyaltyMe.models import UserPlace, Place from App.loyaltyMe.models import Place, Beacon
from App.page.forms import EmailAuthenticationForm from App.page.forms import EmailAuthenticationForm, PlaceForm, PromotionForm
from App.promotion.models import PromotionSet, Promotion
from App.user.models import UserProfile
class CommingSoonView(generic.TemplateView): class CommingSoonView(generic.TemplateView):
...@@ -21,55 +24,115 @@ class MainPageView(generic.TemplateView): ...@@ -21,55 +24,115 @@ class MainPageView(generic.TemplateView):
template_name = 'main_page/base.html' template_name = 'main_page/base.html'
class PlacePageListView(ListView):
template_name = 'panel/place_list.html'
model = Place
def get_queryset(self):
qs = super(PlacePageListView, self).get_queryset()
return qs.filter(owners=self.request.user)
def get_context_data(self, **kwargs):
context = super(PlacePageListView, self).get_context_data(**kwargs)
return context
class PlacePageDetailView(DetailView):
template_name = 'panel/place_detail.html'
model = Place
def get_queryset(self):
qs = super(PlacePageDetailView, self).get_queryset()
return qs.filter(owners=self.request.user)
def get_context_data(self, **kwargs):
context = super(PlacePageDetailView, self).get_context_data(**kwargs)
return context
class PlaceCreateView(CreateView): class PlaceCreateView(CreateView):
template_name = 'panel/place_form.html' template_name = 'panel/place_form.html'
model = Place form_class = PlaceForm
fields = ['name', 'type', 'description']
def get_success_url(self): def get_success_url(self, id):
return reverse('place_detail', args=(self.object.id,)) return reverse('place_detail', args=(id,))
def get_form_kwargs(self):
kwargs = super(PlaceCreateView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
def form_valid(self, form): def form_valid(self, form):
self.object = form.save() new_place = form.save()
UserPlace.objects.create(user=self.request.user, place=self.object) new_place.owners.add(self.request.user)
return super(PlaceCreateView, self).form_valid(form) new_place.save()
return HttpResponseRedirect(self.get_success_url(new_place.id))
class PlaceUpdateView(UpdateView): class PlaceUpdateView(UpdateView):
template_name = 'panel/place_form.html' template_name = 'panel/place_form.html'
model = Place form_class = PlaceForm
fields = ['name', 'type', 'description']
def get_success_url(self): def get_success_url(self):
return reverse('place_detail', args=(self.object.id,)) return reverse('place_detail', args=(self.object.id,))
def get_form_kwargs(self):
kwargs = super(PlaceCreateView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
class PlacePageListView(ListView):
template_name = 'panel/place_list.html' class BeaconPageListView(ListView):
model = Place template_name = 'panel/beacon_list.html'
model = Beacon
def get_queryset(self): def get_queryset(self):
qs = super(PlacePageListView, self).get_queryset() qs = super(BeaconPageListView, self).get_queryset()
return qs.filter(userplace_place__user=self.request.user) return qs.filter(user=self.request.user)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(PlacePageListView, self).get_context_data(**kwargs) context = super(BeaconPageListView, self).get_context_data(**kwargs)
return context return context
class PlacePageDetailView(DetailView): class BeaconPageDetailView(DetailView):
template_name = 'panel/place_detail.html' template_name = 'panel/beacon_detail.html'
model = Place model = Beacon
def get_queryset(self): def get_queryset(self):
qs = super(PlacePageDetailView, self).get_queryset() qs = super(BeaconPageDetailView, self).get_queryset()
return qs.filter(userplace_place__user=self.request.user) return qs.filter(user=self.request.user)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(PlacePageDetailView, self).get_context_data(**kwargs) context = super(BeaconPageDetailView, self).get_context_data(**kwargs)
return context return context
class BeaconCreateView(CreateView):
template_name = 'panel/beacon_form.html'
model = Beacon
fields = ['name', 'description', 'uuid', 'major', 'minor']
def get_success_url(self, id):
return reverse('place_detail', args=(id,))
def form_valid(self, form):
new_beacon = form.save(commit=False)
new_beacon.user = self.request.user
new_beacon.save()
return HttpResponseRedirect(self.get_success_url(new_beacon.id))
class BeaconUpdateView(UpdateView):
template_name = 'panel/beacon_form.html'
model = Beacon
fields = ['name', 'description', 'uuid', 'major', 'minor']
def get_success_url(self):
return reverse('beacon_detail', args=(self.object.id,))
@method_decorator(login_required, name='dispatch') @method_decorator(login_required, name='dispatch')
class PanelPageView(generic.TemplateView): class PanelPageView(generic.TemplateView):
template_name = 'panel/panel.html' template_name = 'panel/panel.html'
...@@ -104,3 +167,78 @@ class LogoutView(TemplateResponseMixin, View): ...@@ -104,3 +167,78 @@ class LogoutView(TemplateResponseMixin, View):
logout(self.request) logout(self.request)
return render(request, self.template_name) return render(request, self.template_name)
return render(request, self.template_name) return render(request, self.template_name)
class UserPageDetailView(DetailView):
template_name = 'panel/user_detail.html'
model = UserProfile
def get_context_data(self, **kwargs):
context = super(UserPageDetailView, self).get_context_data(**kwargs)
return context
class PromotionSetPageDetailView(DetailView):
template_name = 'panel/promotion_set_detail.html'
model = PromotionSet
def get_context_data(self, **kwargs):
context = super(PromotionSetPageDetailView, self).get_context_data(**kwargs)
return context
class PromotionSetCreateView(CreateView):
template_name = 'panel/promotion_set_form.html'
model = PromotionSet
fields = ['name', ]
def get_context_data(self, **kwargs):
context = super(PromotionSetCreateView, self).get_context_data(**kwargs)
return context
def get_success_url(self, id):
return reverse('promotion_set_detail', args=(id,))
def form_valid(self, form, **kwargs):
new_promotion_set = form.save()
place = Place.objects.get(pk=self.kwargs.get('pk'))
new_promotion_set.place_promotion.add(place)
new_promotion_set.save()
return HttpResponseRedirect(self.get_success_url(new_promotion_set.id))
class PromotionPageDetailView(DetailView):
template_name = 'panel/promotion_detail.html'
model = Promotion
def get_context_data(self, **kwargs):
context = super(PromotionPageDetailView, self).get_context_data(**kwargs)
return context
class PromotionCreateView(CreateView):
template_name = 'panel/promotion_form.html'
model = Promotion
form_class = PromotionForm
def get_context_data(self, **kwargs):
context = super(PromotionCreateView, self).get_context_data(**kwargs)
return context
def get_success_url(self, id):
return reverse('promotion_detail', args=(id,))
def form_valid(self, form, **kwargs):
new_promotion = form.save()
promotion_set = PromotionSet.objects.get(pk=self.kwargs.get('pk'))
promotion_set.promotions.add(new_promotion)
new_promotion.save()
return HttpResponseRedirect(self.get_success_url(new_promotion.id))
class PromotionDeleteView(DeleteView):
template_name = 'panel/promotion_confirm_delete.html'
model = Promotion
success_url = reverse_lazy('place_list')
\ No newline at end of file
...@@ -9,7 +9,7 @@ class Command(BaseCommand): ...@@ -9,7 +9,7 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
promotion_sets = [ promotion_sets = [
# 'name',products # 'name',products
['Promocja1', ['10%', '20%']], ['Wakacyjna Promocja', ['10%', '20%']],
['Promocja2', ['20%', '50%']], ['Promocja2', ['20%', '50%']],
] ]
print("Creating PromotionSets") print("Creating PromotionSets")
......
...@@ -41,8 +41,8 @@ class Promotion(models.Model): ...@@ -41,8 +41,8 @@ class Promotion(models.Model):
name = models.CharField(max_length=20) name = models.CharField(max_length=20)
description = models.CharField(max_length=50) description = models.CharField(max_length=50)
code = models.CharField(max_length=10) code = models.CharField(max_length=10, blank=True)
img = models.ImageField() img = models.ImageField(blank=True)
status = models.CharField(max_length=2, choices=STATUS_CHOICES, default=AVAILABLE) status = models.CharField(max_length=2, choices=STATUS_CHOICES, default=AVAILABLE)
task = models.ForeignKey(Task) task = models.ForeignKey(Task)
left_number = models.IntegerField(null=True) left_number = models.IntegerField(null=True)
...@@ -55,7 +55,7 @@ class Promotion(models.Model): ...@@ -55,7 +55,7 @@ class Promotion(models.Model):
class PromotionSet(models.Model): class PromotionSet(models.Model):
name = models.CharField(max_length=20) name = models.CharField(max_length=20)
promotions = models.ManyToManyField('promotion.Promotion', default='') promotions = models.ManyToManyField('promotion.Promotion', default='', related_name='promotion_set')
def __str__(self): def __str__(self):
return self.name return self.name
......
...@@ -26,7 +26,7 @@ class PromotionSetSerializer(serializers.HyperlinkedModelSerializer): ...@@ -26,7 +26,7 @@ class PromotionSetSerializer(serializers.HyperlinkedModelSerializer):
class Meta: class Meta:
model = Offer model = Offer
fields = ('url', 'id', 'promotions') fields = ('url', 'id', 'name', 'promotions')
class UserPromotionSerializer(serializers.HyperlinkedModelSerializer): class UserPromotionSerializer(serializers.HyperlinkedModelSerializer):
user = UserSerializer() user = UserSerializer()
......
...@@ -133,7 +133,14 @@ STATIC_URL = '/static/' ...@@ -133,7 +133,14 @@ STATIC_URL = '/static/'
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
APPEND_SLASH = False
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static') STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
......
...@@ -18,7 +18,10 @@ from django.contrib import admin ...@@ -18,7 +18,10 @@ 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, login from App.page.views import CommingSoonView, MainPageView, LoginView, LogoutView, PanelPageView, PlacePageListView, \
PlacePageDetailView, PlaceCreateView, PlaceUpdateView, BeaconPageListView, BeaconCreateView, BeaconUpdateView, \
BeaconPageDetailView, UserPageDetailView, PromotionSetPageDetailView, PromotionPageDetailView, \
PromotionSetCreateView, PromotionCreateView, PromotionDeleteView
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.promotion import views as promotion_views
from App.user.views import schema_view from App.user.views import schema_view
...@@ -40,9 +43,25 @@ router.register(r'tasks', promotion_views.TaskViewSet) ...@@ -40,9 +43,25 @@ 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'^$', CommingSoonView.as_view(), name='cooming_soon'),
url(r'^main/$', main_page, name='post_list'), url(r'^main/$', MainPageView.as_view(), name='main_page'),
url(r'^login/$', login, name='post_list'), url(r'^panel/$', PanelPageView.as_view(), name='main_page'),
url(r'^login/$', LoginView.as_view(), name='login'),
url(r'^logout/$', LogoutView.as_view(), name='logout'),
url(r'^user/(?P<pk>\d+)/$', UserPageDetailView.as_view(), name='user_detail'),
url(r'^promotion_set/(?P<pk>\d+)/$', PromotionSetPageDetailView.as_view(), name='promotion_set_detail'),
url(r'^promotion_set/(?P<pk>\d+)/promotion/add$', PromotionCreateView.as_view(), name='promotion_create'),
url(r'^place/(?P<pk>\d+)/promotion_set/add$', PromotionSetCreateView.as_view(), name='promotion_set_create'),
url(r'^promotion/(?P<pk>\d+)/$', PromotionPageDetailView.as_view(), name='promotion_detail'),
url(r'^promotion/(?P<pk>\d+)/delete$', PromotionDeleteView.as_view(), name='promotion_delete'),
url(r'^place/$', PlacePageListView.as_view(), name='place_list'),
url(r'^place/add$', PlaceCreateView.as_view(), name='place_add'),
url(r'^place/(?P<pk>\d+)/update$', PlaceUpdateView.as_view(), name='place_update'),
url(r'^place/(?P<pk>\d+)/$', PlacePageDetailView.as_view(), name='place_detail'),
url(r'^beacon/$', BeaconPageListView.as_view(), name='beacon_list'),
url(r'^beacon/add$', BeaconCreateView.as_view(), name='beacon_add'),
url(r'^beacon/(?P<pk>\d+)/update$', BeaconUpdateView.as_view(), name='beacon_update'),
url(r'^beacon/(?P<pk>\d+)/$', BeaconPageDetailView.as_view(), name='beacon_detail'),
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