diff --git a/abonapp/models.py b/abonapp/models.py index 08b58b5..a258e3a 100644 --- a/abonapp/models.py +++ b/abonapp/models.py @@ -15,15 +15,15 @@ from accounts_app.models import UserProfile class LogicError(Exception): def __init__(self, value, err_id=None): - self.value = value + self.message = value if err_id: self.err_id = err_id def __unicode__(self): - return repr(self.value) + return repr(self.message) def __str__(self): - return repr(self.value) + return repr(self.message) class AbonGroup(models.Model): @@ -123,7 +123,7 @@ class AbonTariff(models.Model): def activate(self, current_user): amnt = self.calc_amount_service() # если не хватает денег - if self.abon.ballance > amnt: + if self.abon.ballance < amnt: raise LogicError(u'Не хватает денег на счету') # дата активации услуги self.time_start = timezone.now() @@ -359,6 +359,9 @@ def abon_del_signal(sender, instance, **kwargs): def abontariff_post_save(sender, instance, **kwargs): # Тут или подключение абону услуги, или изменение приоритета + if not kwargs['created']: + # если изменение приоритета то не говорим об этом NAS'у + return agent_trf = TariffStruct(instance.tariff.id, instance.tariff.speedIn, instance.tariff.speedOut) agent_abon = AbonStruct(instance.abon.id, instance.abon.ip_address.int_ip(), agent_trf) tm = Transmitter() @@ -367,6 +370,9 @@ def abontariff_post_save(sender, instance, **kwargs): def abontariff_del_signal(sender, instance, **kwargs): + if not instance.is_started(): + # если удаляем не активную услугу то говорить об этом NAS'у не обязательно + return agent_trf = TariffStruct(instance.tariff.id, instance.tariff.speedIn, instance.tariff.speedOut) agent_abon = AbonStruct(instance.abon.id, instance.abon.ip_address.int_ip(), agent_trf) tm = Transmitter() diff --git a/abonapp/views.py b/abonapp/views.py index b03ad49..e0e1c54 100644 --- a/abonapp/views.py +++ b/abonapp/views.py @@ -7,9 +7,9 @@ from django.db.models import Count from django.shortcuts import render, redirect, get_object_or_404, resolve_url from django.contrib.auth.decorators import login_required, permission_required from django.utils import timezone -from django.template.context_processors import csrf from django.http import HttpResponse, Http404 from django.contrib.auth import get_user_model +from django.contrib import messages from ip_pool.models import IpPoolItem from tariff_app.models import Tariff @@ -42,19 +42,22 @@ def peoples(request, gid): @login_required @permission_required('abonapp.add_abongroup') def addgroup(request): - warntext = '' frm = forms.AbonGroupForm() - if request.method == 'POST': - frm = forms.AbonGroupForm(request.POST) - if frm.is_valid(): - frm.save() - return redirect('abonapp:group_list') - else: - warntext = u'Исправьте ошибки' + try: + if request.method == 'POST': + frm = forms.AbonGroupForm(request.POST) + if frm.is_valid(): + frm.save() + messages.success(request, u'Группа успешно создана') + return redirect('abonapp:group_list') + else: + messages.error(request, u'Исправьте ошибки') + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.error(request, e.message) return render(request, 'abonapp/addGroup.html', { - 'csrf_token': csrf(request)['csrf_token'], - 'form': frm, - 'warntext': warntext + 'form': frm }) @@ -80,17 +83,20 @@ def grouplist(request): @login_required @permission_required('abonapp.delete_abongroup') def delgroup(request): - agd = mydefs.safe_int(request.GET.get('id')) - get_object_or_404(models.AbonGroup, id=agd).delete() - return mydefs.res_success(request, 'abonapp:group_list') + try: + agd = mydefs.safe_int(request.GET.get('id')) + get_object_or_404(models.AbonGroup, id=agd).delete() + return mydefs.res_success(request, 'abonapp:group_list') + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.error(request, e.message) + return mydefs.res_error(request, 'abonapp:group_list') @login_required -@mydefs.only_admins -# @permission_required('abonapp.add_abon') -# @permission_required('abonapp.change_abon') +@permission_required('abonapp.add_abon') def addabon(request, gid): - warning_text = '' frm = None group = None try: @@ -104,18 +110,16 @@ def addabon(request, gid): prf.save() return redirect('abonapp:people_list', group.id) else: - warning_text = u'Некоторые поля заполнены не правильно, проверте ещё раз' - - except IntegrityError, e: - warning_text = "%s: %s" % (warning_text, e) + messages.error(request, u'Некоторые поля заполнены не правильно, проверте ещё раз') + except IntegrityError as e: + messages.error(request, e.message) except models.LogicError as e: - warning_text = e.value - + messages.error(request, e.message) except NasFailedResult as e: - warning_text = e.message + messages.error(request, e.message) except NasNetworkError as e: - warning_text = e.message + messages.error(request, e.message) if not frm: frm = forms.AbonForm(initial={ @@ -124,8 +128,6 @@ def addabon(request, gid): }) return render(request, 'abonapp/addAbon.html', { - 'warntext': warning_text, - 'csrf_token': csrf(request)['csrf_token'], 'form': frm, 'abon_group': group }) @@ -137,38 +139,47 @@ def delentity(request): typ = request.GET.get('t') uid = request.GET.get('id') - if typ == 'a': - if not request.user.has_perm('abonapp.delete_abon'): - raise PermissionDenied - abon = get_object_or_404(models.Abon, id=uid) - gid = abon.group.id - abon.delete() - return mydefs.res_success(request, resolve_url('abonapp:people_list', gid)) - elif typ == 'g': - if not request.user.has_perm('abonapp.delete_abongroup'): - raise PermissionDenied - get_object_or_404(models.AbonGroup, id=uid).delete() - return mydefs.res_success(request, 'abonapp:group_list') - + try: + if typ == 'a': + if not request.user.has_perm('abonapp.delete_abon'): + raise PermissionDenied + abon = get_object_or_404(models.Abon, id=uid) + gid = abon.group.id + abon.delete() + return mydefs.res_success(request, resolve_url('abonapp:people_list', gid)) + elif typ == 'g': + if not request.user.has_perm('abonapp.delete_abongroup'): + raise PermissionDenied + get_object_or_404(models.AbonGroup, id=uid).delete() + return mydefs.res_success(request, 'abonapp:group_list') + except NasNetworkError as e: + messages.error(request, e.message) + except NasFailedResult as e: + messages.error(request, e.message) + return redirect('abonapp:group_list') @login_required @permission_required('abonapp.can_add_ballance') def abonamount(request, gid, uid): - warning_text = '' abon = get_object_or_404(models.Abon, id=uid) - if request.method == 'POST': - abonid = mydefs.safe_int(request.POST.get('abonid')) - if abonid == int(uid): - amnt = mydefs.safe_float(request.POST.get('amount')) - abon.add_ballance(request.user, amnt) - abon.save(update_fields=['ballance']) - return redirect('abonapp:abon_home', gid=gid, uid=uid) - else: - warning_text = u'Не правильно выбран абонент как цель для пополнения' + try: + if request.method == 'POST': + abonid = mydefs.safe_int(request.POST.get('abonid')) + if abonid == int(uid): + amnt = mydefs.safe_float(request.POST.get('amount')) + abon.add_ballance(request.user, amnt) + abon.save(update_fields=['ballance']) + messages.success(request, u'Счёт успешно пополнен на %d' % amnt) + return redirect('abonapp:abon_home', gid=gid, uid=uid) + else: + messages.error(request, u'Не могу разобрать id абонента') + except NasNetworkError as e: + messages.error(request, e.message) + except NasFailedResult as e: + messages.error(request, e.message) return render(request, 'abonapp/abonamount.html', { 'abon': abon, - 'abon_group': get_object_or_404(models.AbonGroup, id=gid), - 'warntext': warning_text + 'abon_group': get_object_or_404(models.AbonGroup, id=gid) }) @@ -219,7 +230,6 @@ def abon_services(request, gid, uid): def abonhome(request, gid, uid): abon = get_object_or_404(models.Abon, id=uid) abon_group = get_object_or_404(models.AbonGroup, id=gid) - warntext = '' ballance = abon.ballance frm = None init_frm_dat = { @@ -248,24 +258,23 @@ def abonhome(request, gid, uid): # return redirect('abonapp:abon_home', gid, uid) else: - warntext = u'Не правильные значения, проверте поля и попробуйте ещё' + messages.warning(request, u'Не правильные значения, проверте поля и попробуйте ещё') else: frm = forms.AbonForm(initial=init_frm_dat) - except IntegrityError, e: - warntext = u'Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. А вообще: %s' % e + except IntegrityError as e: + messages.error(request, u'Проверте введённые вами значения, скорее всего такой ip уже у кого-то есть. А вообще: %s' % e.message) frm = forms.AbonForm(initial=init_frm_dat) except Http404: - warntext = u'Ip адрес не найден в списке IP адресов' + messages.error(request, u'Ip адрес не найден в списке IP адресов') frm = forms.AbonForm(initial=init_frm_dat) except NasFailedResult as e: - warntext = e.message + messages.error(request, e.message) except NasNetworkError as e: - warntext = e.message + messages.error(request, e.message) return render(request, 'abonapp/editAbon.html', { - 'warntext': warntext, 'form': frm or forms.AbonForm(initial=init_frm_dat), 'abon': abon, 'ballance': ballance, @@ -293,34 +302,37 @@ def add_invoice(request, gid, uid): abon = get_object_or_404(models.Abon, id=uid) grp = get_object_or_404(models.AbonGroup, id=gid) - if request.method == 'POST': - curr_amount = mydefs.safe_int(request.POST.get('curr_amount')) - comment = request.POST.get('comment') - - newinv = models.InvoiceForPayment() - newinv.abon = abon - newinv.amount = curr_amount - newinv.comment = comment - - if request.POST.get('status') == u'on': - newinv.status = True - - newinv.author = request.user - newinv.save() - return redirect('abonapp:abon_home', gid=gid, uid=uid) - else: - return render(request, 'abonapp/addInvoice.html', { - 'csrf_token': csrf(request)['csrf_token'], - 'abon': abon, - 'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(), - 'abon_group': grp - }) + try: + if request.method == 'POST': + curr_amount = mydefs.safe_int(request.POST.get('curr_amount')) + comment = request.POST.get('comment') + + newinv = models.InvoiceForPayment() + newinv.abon = abon + newinv.amount = curr_amount + newinv.comment = comment + + if request.POST.get('status') == u'on': + newinv.status = True + + newinv.author = request.user + newinv.save() + return redirect('abonapp:abon_home', gid=gid, uid=uid) + + except NasNetworkError as e: + messages.error(request, e.message) + except NasFailedResult as e: + messages.error(request, e.message) + return render(request, 'abonapp/addInvoice.html', { + 'abon': abon, + 'invcount': models.InvoiceForPayment.objects.filter(abon=abon).count(), + 'abon_group': grp + }) @login_required @permission_required('abonapp.can_buy_tariff') def buy_tariff(request, gid, uid): - warntext = '' frm = None grp = get_object_or_404(models.AbonGroup, id=gid) abon = get_object_or_404(models.Abon, id=uid) @@ -331,21 +343,20 @@ def buy_tariff(request, gid, uid): cd = frm.cleaned_data abon.buy_tariff(cd['tariff'], request.user) abon.save() - return redirect('abonapp:abon_home', gid=gid, uid=abon.id) + return redirect('abonapp:abon_services', gid=gid, uid=abon.id) else: - warntext = u'Что-то не так при покупке услуги, проверьте и попробуйте ещё' + messages.error(request, u'Что-то не так при покупке услуги, проверьте и попробуйте ещё') else: frm = forms.BuyTariff() except models.LogicError as e: - warntext = e.value + messages.error(request, e.message) except NasFailedResult as e: - warntext = e.message + u', но услуга уже подключена, она будет применена когда будет восстановлен доступ к NAS серверу.' \ - u' Вернуться' % resolve_url('abonapp:abon_home', gid=gid, uid=abon.id) + messages.error(request, e.message) except NasNetworkError as e: - warntext = e.message + messages.error(request, e.message) + return redirect('abonapp:abon_services', gid=gid, uid=abon.id) return render(request, 'abonapp/buy_tariff.html', { - 'warntext': warntext, 'form': frm or forms.BuyTariff(), 'abon': abon, 'abon_group': grp @@ -360,10 +371,15 @@ def chpriority(request, gid, uid): current_abon_tariff = get_object_or_404(models.AbonTariff, id=t) - if act == 'up': - current_abon_tariff.priority_up() - elif act == 'down': - current_abon_tariff.priority_down() + try: + if act == 'up': + current_abon_tariff.priority_up() + elif act == 'down': + current_abon_tariff.priority_down() + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.error(request, e.message) return redirect('abonapp:abon_home', gid=gid, uid=uid) @@ -375,7 +391,7 @@ def complete_service(request, gid, uid, srvid): if abtar.abon.id != int(uid): return HttpResponse('

uid not equal uid from service

') - + time_use = None try: if request.method == 'POST': # досрочно завершаем услугу @@ -383,9 +399,10 @@ def complete_service(request, gid, uid, srvid): if finish_confirm == 'yes': # удаляем запись о текущей услуге. abtar.delete() + messages.success(request, u'Услуга успешно завершена') return redirect('abonapp:abon_home', gid, uid) else: - raise models.LogicError('Действие не подтверждено') + raise models.LogicError(u'Действие не подтверждено') time_use = timezone.now() - abtar.time_start time_use = { @@ -393,24 +410,19 @@ def complete_service(request, gid, uid, srvid): 'hours': time_use.seconds / 3600, 'minutes': time_use.seconds / 60 % 60 } - return render(request, 'abonapp/complete_service.html', { - 'abtar': abtar, - 'abon': abtar.abon, - 'time_use': time_use, - 'abon_group': get_object_or_404(models.AbonGroup, id=gid) - }) except models.LogicError as e: - warntext = e.value + messages.error(request, e.message) except NasFailedResult as e: - warntext = e.message + messages.error(request, e.message) except NasNetworkError as e: - warntext = e.message + messages.warning(request, e.message) + return redirect('abonapp:abon_home', gid, uid) return render(request, 'abonapp/complete_service.html', { 'abtar': abtar, 'abon': abtar.abon, - 'warntext': warntext, + 'time_use': time_use, 'abon_group': get_object_or_404(models.AbonGroup, id=gid) }) @@ -419,15 +431,22 @@ def complete_service(request, gid, uid, srvid): @permission_required('abonapp.can_activate_service') def activate_service(request, gid, uid, srvid): abtar = get_object_or_404(models.AbonTariff, id=srvid) + amount = abtar.calc_amount_service() - if request.method == 'POST': - if request.POST.get('finish_confirm') != 'yes': - return HttpResponse('

Request not confirmed

') + try: + if request.method == 'POST': + if request.POST.get('finish_confirm') != 'yes': + return HttpResponse('

Request not confirmed

') - abtar.activate(request.user) - return redirect('abonapp:abon_home', gid, uid) + abtar.activate(request.user) + return redirect('abonapp:abon_home', gid, uid) - amount = abtar.calc_amount_service() + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.warning(request, e.message) + except models.LogicError as e: + messages.error(request, e.message) return render(request, 'abonapp/activate_service.html', { 'abon': abtar.abon, 'abon_group': abtar.abon.group, @@ -440,7 +459,12 @@ def activate_service(request, gid, uid, srvid): @login_required @permission_required('abonapp.delete_abontariff') def unsubscribe_service(request, gid, uid, srvid): - get_object_or_404(models.AbonTariff, id=int(srvid)).delete() + try: + get_object_or_404(models.AbonTariff, id=int(srvid)).delete() + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.warning(request, e.message) return redirect('abonapp:abon_home', gid=gid, uid=uid) @@ -474,22 +498,27 @@ def debtors(request): @mydefs.only_admins def update_nas(request, group_id): users = models.Abon.objects.filter(group=group_id) - tm = Transmitter() - for usr in users: - if usr.ip_address: - user_ip = usr.ip_address.int_ip() - else: - continue - tariff = usr.active_tariff() - if tariff: - agent_trf = TariffStruct(tariff.id, tariff.speedIn, tariff.speedOut) - else: - agent_trf = TariffStruct() - agent_abon = AbonStruct(usr.id, user_ip, agent_trf) - try: - tm.update_user(agent_abon) - except NasFailedResult: - tm.add_user(agent_abon) + try: + tm = Transmitter() + for usr in users: + if usr.ip_address: + user_ip = usr.ip_address.int_ip() + else: + continue + tariff = usr.active_tariff() + if tariff: + agent_trf = TariffStruct(tariff.id, tariff.speedIn, tariff.speedOut) + else: + agent_trf = TariffStruct() + agent_abon = AbonStruct(usr.id, user_ip, agent_trf) + try: + tm.update_user(agent_abon) + except NasFailedResult: + tm.add_user(agent_abon) + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.warning(request, e.message) return redirect('abonapp:people_list', gid=group_id) diff --git a/accounts_app/models.py b/accounts_app/models.py index 9d33b67..637d5bd 100644 --- a/accounts_app/models.py +++ b/accounts_app/models.py @@ -59,10 +59,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin): REQUIRED_FIELDS = ['telephone'] def get_full_name(self): - if self.fio: - return "%s: %s" % (self.username, self.fio) - else: - return self.username + return self.fio if self.fio else self.username def get_short_name(self): return self.username or self.telephone @@ -91,17 +88,3 @@ class UserProfile(AbstractBaseUser, PermissionsMixin): def __unicode__(self): return self.get_full_name() - - -# from django.db.models.signals import post_save - - -'''def create_custom_user(sender, instance, created, **kwargs): - if created: - values = {} - for field in sender._meta.local_fields: - values[field.attname] = getattr(instance, field.attname) - user = UserProfile(**values) - user.save()''' - -#post_save.connect(create_custom_user, User) diff --git a/accounts_app/urls.py b/accounts_app/urls.py index 81812c7..ece0703 100644 --- a/accounts_app/urls.py +++ b/accounts_app/urls.py @@ -18,8 +18,8 @@ urlpatterns = [ url(r'^settings$', views.ch_info, name='setup_info'), url(r'^settings/change_ava$', views.ch_ava, name='setup_avatar'), - url(r'^(?P\d+)$', views.profile_show, name='other_profile'), - url(r'^(?P\d+)/perms$', views.perms, name='setup_perms'), + url(r'^(?P\d+)$', views.profile_show, name='other_profile'), + url(r'^(?P\d+)/perms$', views.perms, name='setup_perms'), url(r'^(?P\d+)/chgroup$', views.chgroup, name='profile_setup_group'), url(r'^(?P\d+)/del$', views.delete_profile, name='delete_profile'), @@ -27,6 +27,6 @@ urlpatterns = [ url(r'^(?P\d+)/appoint_task$', views.appoint_task, name='appoint_task'), url(r'^group/$', views.groups, name='groups_list'), - url(r'^group/(?P\d+)$', views.group, name='group_link') + url(r'^group/(?P\d+)$', views.group, name='group_link') ] \ No newline at end of file diff --git a/accounts_app/views.py b/accounts_app/views.py index 825cf40..99d4bf8 100644 --- a/accounts_app/views.py +++ b/accounts_app/views.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- -from django.contrib.auth.decorators import login_required # , permission_required +from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth import authenticate, login, logout +from django.core.exceptions import PermissionDenied from django.core.urlresolvers import NoReverseMatch from django.shortcuts import render, redirect, get_object_or_404, resolve_url -from django.template.context_processors import csrf from django.http import Http404 from django.contrib.auth.models import Group, Permission +from django.contrib import messages from abonapp.models import AbonGroup from photo_app.models import Photo @@ -54,13 +55,14 @@ def sign_out(request): @login_required @mydefs.only_admins -def profile_show(request, id=0): - id = mydefs.safe_int(id) +def profile_show(request, uid=0): + uid = mydefs.safe_int(uid) - if id == 0: - return redirect('acc_app:other_profile', id=request.user.id) + if uid == 0: + print type(request.user.id), request.user.id + return redirect('acc_app:other_profile', uid=request.user.id) - usr = get_object_or_404(UserProfile, id=id) + usr = get_object_or_404(UserProfile, id=uid) if request.method == 'POST': usr.username = request.POST.get('username') usr.fio = request.POST.get('fio') @@ -68,10 +70,10 @@ def profile_show(request, id=0): usr.is_active = request.POST.get('stat') usr.is_admin = request.POST.get('is_admin') usr.save() - return redirect('acc_app:other_profile', id=id) + return redirect('acc_app:other_profile', uid=uid) return render(request, 'accounts/index.html', { - 'uid': id, + 'uid': uid, 'userprofile': usr }) @@ -119,7 +121,6 @@ def ch_ava(request): @login_required @mydefs.only_admins def ch_info(request): - warntext = '' if request.method == 'POST': user = request.user user.username = request.POST.get('username') @@ -133,19 +134,17 @@ def ch_info(request): newpasswd = request.POST.get('newpasswd') user.set_password(newpasswd) else: - warntext = u'Неправильный пароль' + messages.error(request, u'Неправильный пароль') user.save() request.user = user return render(request, 'accounts/settings/ch_info.html', { - 'user': request.user, - 'warntext': warntext + 'user': request.user }) @login_required -@mydefs.only_admins -##@permission_required('accounts_app.add_userprofile') +@permission_required('acc_app.add_userprofile') def create_profile(request): if request.method == 'POST': username = request.POST.get('username') @@ -160,17 +159,10 @@ def create_profile(request): passwd = request.POST.get('passwd') conpasswd = request.POST.get('conpasswd') if not passwd: - return render(request, 'accounts/create_acc.html', { - 'warntext': u'Забыли указать пароль для нового аккаунта', - 'csrf_token': csrf(request)['csrf_token'], - 'newuser': user - }) + messages.error(request, u'Забыли указать пароль для нового аккаунта') + if not conpasswd: - return render(request, 'accounts/create_acc.html', { - 'warntext': u'Забыли повторить пароль для нового аккаунта', - 'csrf_token': csrf(request)['csrf_token'], - 'newuser': user - }) + messages.error(request, u'Забыли повторить пароль для нового аккаунта') if passwd == conpasswd: user_qs = UserProfile.objects.filter(username=username)[:1] @@ -179,24 +171,21 @@ def create_profile(request): user.save() return redirect('acc_app:accounts_list') else: - return render(request, 'accounts/create_acc.html', { - 'warntext': u'Пользователь с таким именем уже есть', - 'csrf_token': csrf(request)['csrf_token'], - 'newuser': user - }) + messages.error(request, u'Пользователь с таким именем уже есть') else: - return render(request, 'accounts/create_acc.html', { - 'warntext': u'Пароли не совпадают, попробуйте ещё раз', - 'csrf_token': csrf(request)['csrf_token'], - 'newuser': user - }) - return render(request, 'accounts/create_acc.html', {'csrf_token': csrf(request)['csrf_token'], }) + messages.error(request, u'Пароли не совпадают, попробуйте ещё раз') + return render(request, 'accounts/create_acc.html', { + 'newuser': user + }) + return render(request, 'accounts/create_acc.html') @login_required @mydefs.only_admins -# @permission_required('accounts_app.del_userprofile') def delete_profile(request, uid): + if uid != request.user.id: + if not request.user.has_perm('acc_app.delete_userprofile'): + raise PermissionDenied prf = get_object_or_404(UserProfile, id=uid) prf.delete() return redirect('acc_app:accounts_list') @@ -216,13 +205,12 @@ def acc_list(request): @login_required @mydefs.only_admins -# @permission_required('accounts_app.change_userprofile') -def perms(request, id): - profile = get_object_or_404(UserProfile, id=id) +def perms(request, uid): + profile = get_object_or_404(UserProfile, id=uid) own_permissions = UserProfile.get_all_permissions(profile) return render(request, 'accounts/settings/permissions.html', { - 'uid': id, + 'uid': uid, 'own_permissions': own_permissions }) @@ -241,10 +229,9 @@ def groups(request): @login_required @mydefs.only_admins -# @permission_required('auth.change_group') -def group(request, id): - id = mydefs.safe_int(id) - grp = get_object_or_404(Group, id=id) +def group(request, uid): + uid = mydefs.safe_int(uid) + grp = get_object_or_404(Group, id=uid) if request.method == 'POST': group_rights = filter(lambda x: x[0] == 'group_rights', request.POST.lists())[0][1] @@ -253,7 +240,7 @@ def group(request, id): rid = mydefs.safe_int(grr) grp.permissions.add(rid) grp.save() - return redirect('acc_app:profile_group_link', id=id) + return redirect('acc_app:profile_group_link', id=uid) grp_rights = grp.permissions.all() all_rights = Permission.objects.exclude(group=grp) @@ -263,7 +250,6 @@ def group(request, id): # print u"%s | %s" % (pr.name, pr.codename) return render(request, 'accounts/group.html', { - 'csrf_token': csrf(request)['csrf_token'], 'group': grp, 'all_rights': all_rights, 'grp_rights': grp_rights diff --git a/clientsideapp/urls.py b/clientsideapp/urls.py index 9de984a..dd0b107 100644 --- a/clientsideapp/urls.py +++ b/clientsideapp/urls.py @@ -7,7 +7,8 @@ import views urlpatterns = [ url(r'^$', views.home, name='home'), url(r'^pays$', views.pays, name='pays'), - url(r'^buy$', views.buy_service, name='buy'), + url(r'^services$', views.services, name='services'), + url(r'^services/(?P\d+)/buy$', views.buy_service, name='buy_service'), url(r'^debts$', views.debts_list, name='debts'), url(r'^debts/(?P\d+)$', views.debt_buy, name='debt_buy') ] diff --git a/clientsideapp/views.py b/clientsideapp/views.py index 9d2a7cc..da2f1c4 100644 --- a/clientsideapp/views.py +++ b/clientsideapp/views.py @@ -1,10 +1,12 @@ # coding=utf-8 from django.contrib.auth.decorators import login_required from django.shortcuts import render, get_object_or_404, redirect +from django.contrib import messages from abonapp.models import AbonLog, AbonTariff, InvoiceForPayment, Abon, LogicError from tariff_app.models import Tariff from mydefs import pag_mn +from agent import NasFailedResult, NasNetworkError @login_required @@ -22,21 +24,27 @@ def pays(request): @login_required -def buy_service(request): +def services(request): all_tarifs = Tariff.objects.all() - own_abon_tariffs = AbonTariff.objects.filter(abon_id=request.user.id) - current_service = own_abon_tariffs.exclude(time_start=None) current_service = current_service[0] if current_service.count() > 0 else None - return render(request, 'clientsideapp/buy.html', { + return render(request, 'clientsideapp/services.html', { 'tarifs': all_tarifs, 'own_abon_tariffs': own_abon_tariffs, 'current_service': current_service }) +@login_required +def buy_service(request, srv_id): + service = get_object_or_404(Tariff, id=srv_id) + return render(request, 'clientsideapp/service_buy.html', { + 'service': service + }) + + @login_required def debts_list(request): debts = InvoiceForPayment.objects.filter(abon=request.user) @@ -47,7 +55,6 @@ def debts_list(request): @login_required def debt_buy(request, d_id): - warntext = u'' debt = get_object_or_404(InvoiceForPayment, id=d_id) abon = get_object_or_404(Abon, id=request.user.id) if request.method == 'POST': @@ -64,9 +71,12 @@ def debt_buy(request, d_id): debt.save(update_fields=['status', 'date_pay']) return redirect('client_side:debts') except LogicError, e: - warntext = e.value + messages.error(request, e.value) + except NasFailedResult as e: + messages.error(request, e.message) + except NasNetworkError as e: + messages.error(request, e.message) return render(request, 'clientsideapp/debt_buy.html', { - 'warntext': warntext, 'debt': debt, 'amount': debt.amount, 'ballance_after': abon.ballance - debt.amount diff --git a/devapp/views.py b/devapp/views.py index 8c27df3..c4bfb86 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- -from django.contrib.auth.decorators import login_required +from django.contrib.auth.decorators import login_required, permission_required +from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib import messages from models import Device from mydefs import pag_mn, res_success, res_error, only_admins @@ -19,7 +21,7 @@ def devices(request): @login_required -@only_admins +@permission_required('devapp.delete_device') def devdel(request, did): try: get_object_or_404(Device, id=did).delete() @@ -31,21 +33,25 @@ def devdel(request, did): @login_required @only_admins def dev(request, devid=0): - warntext = '' devinst = get_object_or_404(Device, id=devid) if devid != 0 else None if request.method == 'POST': + if devid == 0: + if not request.user.has_perm('devapp.add_device'): + raise PermissionDenied + else: + if not request.user.has_perm('devapp.change_device'): + raise PermissionDenied frm = DeviceForm(request.POST, instance=devinst) if frm.is_valid(): frm.save() return redirect('devapp:devs') else: - warntext = u'Ошибка в данных, проверте их ещё раз' + messages.error(request, u'Ошибка в данных, проверте их ещё раз') else: frm = DeviceForm(instance=devinst) return render(request, 'devapp/dev.html', { - 'warntext': warntext, 'form': frm, 'devid': devid }) @@ -54,11 +60,9 @@ def dev(request, devid=0): @login_required @only_admins def devview(request, did): - warntext = '' dev = get_object_or_404(Device, id=did) return render(request, 'devapp/ports.html', { - 'warntext': warntext, 'dev': dev }) diff --git a/ip_pool/views.py b/ip_pool/views.py index c84b774..9e2d947 100644 --- a/ip_pool/views.py +++ b/ip_pool/views.py @@ -1,5 +1,7 @@ -from django.contrib.auth.decorators import login_required +# -*- coding: utf-8 -*- +from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib import messages from forms import PoolForm from models import IpPoolItem @@ -39,7 +41,7 @@ def ips(request): @login_required -@mydefs.only_admins +@permission_required('ip_pool.delete_ippoolitem') def del_pool(request): ip_start = request.GET.get('ips') ip_end = request.GET.get('ipe') @@ -54,7 +56,7 @@ def del_pool(request): @login_required -@mydefs.only_admins +@permission_required('ip_pool.add_ippoolitem') def add_pool(request): if request.method == 'POST': frm = PoolForm(request.POST) @@ -63,18 +65,16 @@ def add_pool(request): IpPoolItem.objects.add_pool(cd['start_ip'], cd['end_ip']) return redirect('ip_pool:home') else: - warntext = u'Form is not valid' + messages.error(request, u'Исправьте ошибки') else: frm = PoolForm() - warntext = '' return render(request, 'ip_pool/add_pool.html', { - 'form': frm, - 'warntext': warntext + 'form': frm }) @login_required -@mydefs.only_admins +@permission_required('ip_pool.delete_ippoolitem') def delip(request): ipid = request.GET.get('id') get_object_or_404(IpPoolItem, id=ipid).delete() diff --git a/tariff_app/views.py b/tariff_app/views.py index 77fb7e7..95ee66c 100644 --- a/tariff_app/views.py +++ b/tariff_app/views.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- -from django.contrib.auth.decorators import login_required +from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import render, get_object_or_404, redirect +from django.contrib import messages +from django.core.exceptions import PermissionDenied from models import Tariff import mydefs @@ -13,7 +15,7 @@ def tarifs(request): tars = Tariff.objects.all() # фильтр - dir, field = mydefs.order_helper(request) + direct, field = mydefs.order_helper(request) if field: tars = tars.order_by(field) @@ -21,24 +23,29 @@ def tarifs(request): return render(request, 'tariff_app/tarifs.html', { 'tariflist': tars, - 'dir': dir, + 'dir': direct, 'order_by': request.GET.get('order_by') }) @login_required -@mydefs.only_admins def edit_tarif(request, tarif_id=0): tarif_id = mydefs.safe_int(tarif_id) - warntext = '' + if tarif_id == 0: + if not request.user.has_perm('tariff_app.add_tariff'): + raise PermissionDenied + else: + if not request.user.has_perm('tariff_app.change_tariff'): + raise PermissionDenied + if request.method == 'POST': frm = forms.TariffForm(request.POST) if frm.is_valid(): frm.save() return redirect('tarifs:home') else: - warntext = u'Не все поля заполнены правильно, проверте и попробуйте ещё раз' + messages.warning(request, u'Не все поля заполнены правильно, проверте и попробуйте ещё раз') else: if tarif_id == 0: tarif = Tariff() @@ -47,14 +54,13 @@ def edit_tarif(request, tarif_id=0): frm = forms.TariffForm(instance=tarif) return render(request, 'tariff_app/editTarif.html', { - 'warntext': warntext, 'form': frm, 'tarif_id': tarif_id }) @login_required -@mydefs.only_admins +@permission_required('tariff_app.delete_tariff') def del_tarif(request, id): tar_id = mydefs.safe_int(id) get_object_or_404(Tariff, id=tar_id).delete() diff --git a/taskapp/views.py b/taskapp/views.py index dfc793d..6921351 100644 --- a/taskapp/views.py +++ b/taskapp/views.py @@ -2,6 +2,7 @@ from django.contrib.auth.decorators import login_required, permission_required from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib import messages from abonapp.models import Abon from datetime import date from models import Task @@ -102,7 +103,6 @@ def view(request, task_id): @only_admins def task_add_edit(request, task_id=0): task_id = safe_int(task_id) - warntext = '' uid = request.GET.get('uid') selected_abon = None frm = TaskFrm() @@ -147,14 +147,13 @@ def task_add_edit(request, task_id=0): task_instance.save() return redirect('taskapp:home') else: - warntext=u'Нет ответственных за группу, в которой находится выбранный абонент' + messages.error(request, u'Нет ответственных за группу, в которой находится выбранный абонент') else: - warntext=u'Нужно выбрать абонента' + messages.error(request, u'Нужно выбрать абонента') else: - warntext = u'Ошибка в полях формы в задаче' + messages.error(request, u'Ошибка в полях формы в задаче') return render(request, 'taskapp/add_edit_task.html', { - 'warntext': warntext, 'form': frm, 'task_id': tsk.id, 'selected_abon': selected_abon diff --git a/templates/abonapp/abonamount.html b/templates/abonapp/abonamount.html index b9579ec..733375b 100644 --- a/templates/abonapp/abonamount.html +++ b/templates/abonapp/abonamount.html @@ -3,12 +3,6 @@ Начисление средств на счёт - {% if warntext %} -
- - {{ warntext }} -
- {% endif %}
diff --git a/templates/abonapp/activate_service.html b/templates/abonapp/activate_service.html index 9ac6902..14c2827 100644 --- a/templates/abonapp/activate_service.html +++ b/templates/abonapp/activate_service.html @@ -10,15 +10,13 @@
  • Активировать услугу
  • + {% include 'message_block.html' %}

    Активировать услугу

    - {% if warntext %} -
    {{ warntext }}
    - {% endif %}
    {% csrf_token %} diff --git a/templates/abonapp/addAbon.html b/templates/abonapp/addAbon.html index 22e4ce5..420ab35 100644 --- a/templates/abonapp/addAbon.html +++ b/templates/abonapp/addAbon.html @@ -8,15 +8,13 @@
  • Добавить абонента
  • + {% include 'message_block.html' %}

    Добавьте аккаунт абонента

    - {% if warntext %} -
    {{ warntext }}
    - {% endif %} {% csrf_token %}
    diff --git a/templates/abonapp/addGroup.html b/templates/abonapp/addGroup.html index 87b06a1..20e72e6 100644 --- a/templates/abonapp/addGroup.html +++ b/templates/abonapp/addGroup.html @@ -8,15 +8,13 @@
  • Добавить группу
  • + {% include 'message_block.html' %}

    Добавьте группу абонентов

    - {% if warntext %} -
    {{ warntext }}
    - {% endif %} {% csrf_token %}
    diff --git a/templates/abonapp/addInvoice.html b/templates/abonapp/addInvoice.html index 066b034..22f9a26 100644 --- a/templates/abonapp/addInvoice.html +++ b/templates/abonapp/addInvoice.html @@ -10,6 +10,7 @@
  • Добавить долг
  • + {% include 'message_block.html' %}
    diff --git a/templates/abonapp/buy_tariff.html b/templates/abonapp/buy_tariff.html index 72d4070..a645b0f 100644 --- a/templates/abonapp/buy_tariff.html +++ b/templates/abonapp/buy_tariff.html @@ -10,7 +10,7 @@
  • Заказать услугу
  • - + {% include 'message_block.html' %}
    @@ -19,12 +19,6 @@
    - {% if warntext %} -
    - - Внимание! {{ warntext|safe }} -
    - {% endif %} {% csrf_token %}
    diff --git a/templates/abonapp/complete_service.html b/templates/abonapp/complete_service.html index 8ff6a81..6433cdc 100644 --- a/templates/abonapp/complete_service.html +++ b/templates/abonapp/complete_service.html @@ -10,18 +10,15 @@
  • Завершить услугу
  • - + {% include 'message_block.html' %}

    Завершить услугу

    - {% if warntext %} -
    {{ warntext }}
    - {% endif %} - {% csrf_token %} + + {% csrf_token %}

    Досрочное завершение текущей услуги приведёт к тому что пользователю будет запрещён доступ к ресурсам diff --git a/templates/abonapp/debtors.html b/templates/abonapp/debtors.html index 988b77a..1499b41 100644 --- a/templates/abonapp/debtors.html +++ b/templates/abonapp/debtors.html @@ -8,6 +8,7 @@

  • Должники
  • + {% include 'message_block.html' %}

    Народ, у которого есть неоплаченные услуги

    diff --git a/templates/abonapp/editAbon.html b/templates/abonapp/editAbon.html index 5d25a32..5322783 100644 --- a/templates/abonapp/editAbon.html +++ b/templates/abonapp/editAbon.html @@ -2,13 +2,6 @@ {% block content %} - {% if warntext %} -
    - - {{ warntext }} -
    - {% endif %} -
    {% csrf_token %} diff --git a/templates/abonapp/ext.htm b/templates/abonapp/ext.htm index 26f9d4a..7b77358 100644 --- a/templates/abonapp/ext.htm +++ b/templates/abonapp/ext.htm @@ -8,12 +8,7 @@
  • {{ abon.fio }}
  • - {% if warntext %} -
    - - Предупреждение! {{ warntext }} -
    - {% endif %} + {% include 'message_block.html' %}