Browse Source

Merge branch 'devel' of https://github.com/nerosketch/djing into devel

devel
bashmak 9 years ago
parent
commit
64fb2f287d
  1. 8
      abonapp/forms.py
  2. 9
      abonapp/locale/ru/LC_MESSAGES/django.po
  3. 21
      abonapp/migrations/0013_abongroup_tariffs.py
  4. 3
      abonapp/models.py
  5. 6
      abonapp/templates/abonapp/buy_tariff.html
  6. 19
      abonapp/templates/abonapp/group_list.html
  7. 33
      abonapp/templates/abonapp/group_tariffs.html
  8. 27
      abonapp/templates/abonapp/peoples.html
  9. 1
      abonapp/urls_abon.py
  10. 37
      abonapp/views.py
  11. 13
      agent/mod_mikrotik.py
  12. 1
      bugs.txt
  13. 9
      clientsideapp/views.py

8
abonapp/forms.py

@ -82,11 +82,3 @@ class AbonGroupForm(forms.ModelForm):
'title': forms.TextInput(attrs={'class': 'form-control'}),
'profiles': forms.TextInput(attrs={'class': 'form-control'})
}
class BuyTariff(forms.Form):
tariff = forms.ModelChoiceField(
queryset=models.Tariff.objects.all(),
required=True,
widget=forms.Select(attrs={'class': 'form-control'})
)

9
abonapp/locale/ru/LC_MESSAGES/django.po

@ -674,3 +674,12 @@ msgstr "История задач"
msgid "Dynamic Field"
msgstr "Динамическое поле"
msgid "Tariffs in groups"
msgstr "Тарифы в группах"
msgid "Belonging services for groups"
msgstr "Принадлежность услуг к группам"
msgid "Tariff your picked does not exist"
msgstr "Тариф, который вы выбрали, не существует"

21
abonapp/migrations/0013_abongroup_tariffs.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-03-21 11:30
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tariff_app', '0002_tariff_descr'),
('abonapp', '0012_auto_20170227_1718'),
]
operations = [
migrations.AddField(
model_name='abongroup',
name='tariffs',
field=models.ManyToManyField(blank=True, related_name='tariff_groups', to='tariff_app.Tariff'),
),
]

3
abonapp/models.py

@ -18,6 +18,7 @@ class LogicError(Exception):
class AbonGroup(models.Model):
title = models.CharField(max_length=127, unique=True)
profiles = models.ManyToManyField(UserProfile, blank=True, related_name='abon_groups')
tariffs = models.ManyToManyField(Tariff, blank=True, related_name='tariff_groups')
class Meta:
db_table = 'abonent_groups'
@ -276,7 +277,7 @@ class Abon(UserProfile):
nw = timezone.make_aware(datetime.now())
for at in ats:
# усдуга не активна, продолжаем
# услуга не активна, продолжаем
if at.deadline is None:
continue
# если услуга просрочена

6
abonapp/templates/abonapp/buy_tariff.html

@ -26,7 +26,11 @@
<div class="input-group">
<span class="input-group-addon"><span class="glyphicon glyphicon-bullhorn"></span></span>
{{ form.tariff }}{{ form.tariff.errors }}
<select class="form-control" name="tariff">
{% for trf in tariffs %}
<option value="{{ trf.pk }}">{{ trf.title }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="btn-group">

19
abonapp/templates/abonapp/group_list.html

@ -32,18 +32,21 @@
<tbody>
{% for gr in groups %}
<tr>
<td>{{ gr.id }}</td>
<td><a href="{% url 'abonapp:people_list' gr.id %}">{{ gr.title }}</a></td>
<td>{{ gr.pk }}</td>
<td><a href="{% url 'abonapp:people_list' gr.pk %}">{{ gr.title }}</a></td>
<td>{{ gr.usercount }}</td>
<td>
<td class="btn-group">
{% if perms.abonapp.delete_abongroup %}
{% if gr.usercount > 0 %}
<a href="#" class="btn btn-sm btn-default disabled">
{% else %}
<a href="{% url 'abonapp:del_group' %}?t=a&id={{ gr.id }}" class="btn btn-sm btn-danger">
{% if gr.usercount == 0 %}
<a href="{% url 'abonapp:del_group' %}?t=a&id={{ gr.pk }}" class="btn btn-sm btn-danger">
<span class="glyphicon glyphicon-remove-circle"></span>
</a>
{% endif %}
<span class="glyphicon glyphicon-remove-circle"></span></a>
{% endif %}
<a href="{% url 'abonapp:ch_group_tariff' gr.pk %}" class="btn btn-sm btn-default"
title="{% trans 'User groups' %}">
<span class="glyphicon glyphicon-subscript"></span>
</a>
</td>
</tr>
{% empty %}

33
abonapp/templates/abonapp/group_tariffs.html

@ -0,0 +1,33 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% block main %}
<ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'abonapp:group_list' %}">{% trans 'User groups' %}</a></li>
<li><a href="{% url 'abonapp:people_list' abon_group.id %}">{{ abon_group.title }}</a></li>
<li class="active">{% trans 'Belonging services for groups' %}</li>
</ol>
{% include 'message_block.html' %}
<legend>{% trans 'Belonging services for groups' %}</legend>
<form action="{% url 'abonapp:ch_group_tariff' abon_group.pk %}" method="post" role="form">{% csrf_token %}
{% for tariff in tariffs %}
<div class="checkbox">
<label>
{% if tariff in abon_group.tariffs.all %}
<input name="tr" type="checkbox" value="{{ tariff.pk }}" checked/>
{% else %}
<input name="tr" type="checkbox" value="{{ tariff.pk }}"/>
{% endif %}
{{ tariff.title }}
</label>
</div>
{% endfor %}
<div class="btn-group">
<input type="submit" class="btn btn-primary" value="{% trans 'Save' %}"> <input type="reset" class="btn btn-default" value="{% trans 'Reset' %}">
</div>
</form>
{% endblock %}

27
abonapp/templates/abonapp/peoples.html

@ -17,31 +17,31 @@
<thead>
<tr>
<th>
<a href="{% url 'abonapp:people_list' abon_group.id %}?order_by=username&dir={{ dir|default:"down" }}">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?order_by=username&dir={{ dir|default:"down" }}">
{% trans 'Sub' %}
</a>
{% if order_by == 'username' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<a href="{% url 'abonapp:people_list' abon_group.id %}?order_by=ip_address&dir={{ dir|default:"down" }}">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?order_by=ip_address&dir={{ dir|default:"down" }}">
{% trans 'Ip address' %}
</a>
{% if order_by == 'ip_address' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<a href="{% url 'abonapp:people_list' abon_group.id %}?order_by=fio&dir={{ dir|default:"down" }}">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?order_by=fio&dir={{ dir|default:"down" }}">
{% trans 'fio' %}
</a>
{% if order_by == 'fio' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th>
<a herf="{% url 'abonapp:people_list' abon_group.id %}?order_by=street&dir={{ dir|default:"down" }}">
<a herf="{% url 'abonapp:people_list' abon_group.pk %}?order_by=street&dir={{ dir|default:"down" }}">
{% trans 'Street' %}
</a>
{% if order_by == 'street' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
</th>
<th width="100">
<a herf="{% url 'abonapp:people_list' abon_group.id %}?order_by=house&dir={{ dir|default:"down" }}">
<a herf="{% url 'abonapp:people_list' abon_group.pk %}?order_by=house&dir={{ dir|default:"down" }}">
{% trans 'House' %}/{% trans 'Apartment' %}
</a>
{% if order_by == 'house' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
@ -49,7 +49,7 @@
<th width="150">{% trans 'Telephone' %}</th>
<th width="150">{% trans 'Service' %}</th>
<th width="50">
<a href="{% url 'abonapp:people_list' abon_group.id %}?order_by=ballance&dir={{ dir|default:"down" }}">
<a href="{% url 'abonapp:people_list' abon_group.pk %}?order_by=ballance&dir={{ dir|default:"down" }}">
{% trans 'Ballance' %}
</a>
{% if order_by == 'ballance' %}<span class="glyphicon glyphicon-filter"></span>{% endif %}
@ -64,7 +64,7 @@
{% else %}
<tr class="danger">
{% endif %}
<td><a href="{% url 'abonapp:abon_home' human.group.id human.id %}">{{ human.username }}</a></td>
<td><a href="{% url 'abonapp:abon_home' human.group.pk human.pk %}">{{ human.username }}</a></td>
<td>{{ human.ip_address|default:_('Not assigned') }}</td>
<td>{{ human.fio }}</td>
<td>{{ human.street|default:_('Not assigned') }}</td>
@ -73,7 +73,7 @@
<td>
{% if human.active_tariff %}
{% if perms.tariff_app.change_tariff %}
<a href="{% url 'tarifs:edit' human.active_tariff.id %}">{{ human.active_tariff.title }}</a>
<a href="{% url 'tarifs:edit' human.active_tariff.pk %}">{{ human.active_tariff.title }}</a>
{% else %}
{{ human.active_tariff.title }}
{% endif %}
@ -83,7 +83,7 @@
<td>{{ human.ballance }}</td>
<td>
{% if perms.abonapp.delete_abon %}
<a href="{% url 'abonapp:del_abon' %}?t=a&id={{ human.id }}" class="btn btn-danger btn-sm">
<a href="{% url 'abonapp:del_abon' %}?t=a&id={{ human.pk }}" class="btn btn-danger btn-sm">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
@ -94,7 +94,7 @@
<td colspan="9">
{% trans 'Subscribers not found' %}.
{% if perms.abonapp.add_abon %}
<a href="{% url 'abonapp:add_abon' abon_group.id %}">{% trans 'Add abon' %}</a>
<a href="{% url 'abonapp:add_abon' abon_group.pk %}">{% trans 'Add abon' %}</a>
{% endif %}
</td>
</tr>
@ -104,13 +104,16 @@
<tr>
<td colspan="9" class="btn-group">
{% if perms.abonapp.add_abon %}
<a href="{% url 'abonapp:add_abon' abon_group.id %}" class="btn btn-sm btn-default" title="Добавить">
<a href="{% url 'abonapp:add_abon' abon_group.pk %}" class="btn btn-sm btn-default" title="Добавить">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add abon' %}
</a>
{% endif %}
<a href="{% url 'abonapp:update_nas' abon_group.id %}" class="btn btn-sm btn-default">
<a href="{% url 'abonapp:update_nas' abon_group.pk %}" class="btn btn-sm btn-default">
<span class="glyphicon glyphicon-refresh"></span> {% trans 'Refresh subscribers on NAS' %}
</a>
<a href="{% url 'abonapp:ch_group_tariff' abon_group.pk %}" class="btn btn-sm btn-default" title="{% trans 'User groups' %}">
<span class="glyphicon glyphicon-subscript"></span> {% trans 'Tariffs in groups' %}
</a>
</td>
</tr>
</tfoot>

1
abonapp/urls_abon.py

@ -5,6 +5,7 @@ from . import views
urlpatterns = [
url(r'^$', views.peoples, name='people_list'),
url(r'^addabon$', views.addabon, name='add_abon'),
url(r'^groups$', views.chgroup_tariff, name='ch_group_tariff'),
url(r'^(?P<uid>\d+)$', views.abonhome, name='abon_home'),
url(r'^(?P<uid>\d+)/services$', views.abon_services, name='abon_services'),

37
abonapp/views.py

@ -329,22 +329,15 @@ def add_invoice(request, gid, uid):
@login_required
@permission_required('abonapp.can_buy_tariff')
def pick_tariff(request, gid, uid):
frm = None
grp = get_object_or_404(models.AbonGroup, id=gid)
abon = get_object_or_404(models.Abon, id=uid)
tariffs = grp.tariffs.all()
try:
if request.method == 'POST':
frm = forms.BuyTariff(request.POST)
if frm.is_valid():
cd = frm.cleaned_data
abon.pick_tariff(cd['tariff'], request.user)
#abon.save()
messages.success(request, _('Tariff has been picked'))
return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
else:
messages.error(request, _('fix form errors'))
else:
frm = forms.BuyTariff()
trf = Tariff.objects.get(pk=request.POST.get('tariff'))
abon.pick_tariff(trf, request.user)
messages.success(request, _('Tariff has been picked'))
return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
except models.LogicError as e:
messages.error(request, e)
except NasFailedResult as e:
@ -352,9 +345,11 @@ def pick_tariff(request, gid, uid):
except NasNetworkError as e:
messages.error(request, e)
return redirect('abonapp:abon_services', gid=gid, uid=abon.id)
except Tariff.DoesNotExist:
messages.error(request, _('Tariff your picked does not exist'))
return render(request, 'abonapp/buy_tariff.html', {
'form': frm or forms.BuyTariff(),
'tariffs': tariffs,
'abon': abon,
'abon_group': grp
})
@ -552,6 +547,22 @@ def passport_view(request, gid, uid):
})
@login_required
@mydefs.only_admins
def chgroup_tariff(request, gid):
grp = get_object_or_404(models.AbonGroup, pk=gid)
if request.method == 'POST':
tr = request.POST.getlist('tr')
grp.tariffs.clear()
grp.tariffs.add(*[int(d) for d in tr])
grp.save()
tariffs = Tariff.objects.all()
return render(request, 'abonapp/group_tariffs.html', {
'abon_group': grp,
'tariffs': tariffs
})
# API's
def abons(request):

13
agent/mod_mikrotik.py

@ -10,7 +10,7 @@ from djing.settings import DEBUG
import re
#DEBUG=False
DEBUG=False
LIST_USERS_ALLOWED = 'DjingUsersAllowed'
LIST_USERS_BLOCKED = 'DjingUsersBlocked'
@ -234,7 +234,8 @@ class QueueManager(TransmitterManager):
def remove(self, user):
assert isinstance(user, AbonStruct)
q = self.find('uid%d' % user.uid)
return self._exec_cmd(['/queue/simple/remove', '=.id=*' + str(q.sid)])
if q is not None:
return self._exec_cmd(['/queue/simple/remove', '=.id=*' + str(q.sid)])
def remove_range(self, q_ids):
names = ['%d' % usr for usr in q_ids]
@ -277,14 +278,18 @@ class QueueManager(TransmitterManager):
q = self.find('uid%d' % user.uid)
if q is None:
self.add(user)
return self._exec_cmd(['/queue/simple/disable', '=.id=*' + q.sid])
return self.disable(user)
else:
return self._exec_cmd(['/queue/simple/disable', '=.id=*' + q.sid])
def enable(self, user):
assert isinstance(user, AbonStruct)
q = self.find('uid%d' % user.uid)
if q is None:
self.add(user)
return self._exec_cmd(['/queue/simple/enable', '=.id=*' + q.sid])
self.enable(user)
else:
return self._exec_cmd(['/queue/simple/enable', '=.id=*' + q.sid])
class IpAddressListManager(TransmitterManager):

1
bugs.txt

@ -6,3 +6,4 @@
- Пароли абонентов надо шифровать ключом для паролей
- Доделать везде переводы
- Не надо коннектиться к микротику когда не собираемся ничего изменять. А то при сохранении залогинились и вышли без действий
- Не удаляет просроченные услуги если не пингуется NAS

9
clientsideapp/views.py

@ -27,8 +27,9 @@ def pays(request):
@login_required
def services(request):
all_tarifs = Tariff.objects.all()
own_abon_tariffs = AbonTariff.objects.filter(abon_id=request.user.id)
abon = Abon.objects.get(pk=request.user.pk)
all_tarifs = abon.group.tariffs.all()
own_abon_tariffs = AbonTariff.objects.filter(abon=abon)
current_service = own_abon_tariffs.exclude(time_start=None)
current_service = current_service[0] if current_service.count() > 0 else None
@ -41,8 +42,8 @@ def services(request):
@login_required
def buy_service(request, srv_id):
abon = get_object_or_404(Abon, id=request.user.pk)
service = get_object_or_404(Tariff, id=srv_id)
abon = get_object_or_404(Abon, pk=request.user.pk)
service = get_object_or_404(Tariff, pk=srv_id)
try:
current_service = abon.active_tariff()
if request.method == 'POST':

Loading…
Cancel
Save