From 4db352f55b20cd472e62e6753447657319f501eb Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 7 Sep 2016 20:51:33 +0800 Subject: [PATCH] Add idc --- apps/assets/forms.py | 23 ++++++- apps/assets/models.py | 2 +- .../templates/assets/asset_group_create.html | 14 +---- apps/assets/templates/assets/idc_create.html | 61 +++++++++++++++++++ apps/assets/templates/assets/idc_list.html | 35 +++++++++++ apps/assets/urls.py | 7 ++- apps/assets/views.py | 58 +++++++++++++++++- apps/templates/_nav.html | 2 +- apps/users/templates/users/_user.html | 2 +- .../templates/users/user_group_create.html | 2 +- 10 files changed, 185 insertions(+), 21 deletions(-) create mode 100644 apps/assets/templates/assets/idc_create.html create mode 100644 apps/assets/templates/assets/idc_list.html diff --git a/apps/assets/forms.py b/apps/assets/forms.py index ca7b1670f..dec1b0876 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -50,12 +50,31 @@ class AssetGroupForm(forms.ModelForm): } -class IdcForm(forms.ModelForm): +class IDCForm(forms.ModelForm): + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(IDCForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(IDCForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + class Meta: model = IDC fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'network', 'comment'] widgets = { - 'name': forms.TextInput(attrs={'placeholder': 'Name'}), + 'name': forms.TextInput(attrs={'placeholder': _('Name')}), 'network': forms.Textarea( attrs={'placeholder': '192.168.1.0/24\n192.168.2.0/24'}) } diff --git a/apps/assets/models.py b/apps/assets/models.py index 3e4c224cf..c98caa671 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -136,7 +136,7 @@ class Asset(models.Model): password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_("Admin password")) admin_user = models.ForeignKey(AdminUser, null=True, on_delete=models.SET_NULL, verbose_name=_("Admin user")) system_user = models.ManyToManyField(SystemUser, blank=True, verbose_name=_("System User")) - idc = models.ForeignKey(IDC, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('IDC')) + idc = models.ForeignKey(IDC, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('IDC')) mac_addr = models.CharField(max_length=20, null=True, blank=True, verbose_name=_("Mac address")) brand = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('Brand')) cpu = models.CharField(max_length=64, null=True, blank=True, verbose_name=_('CPU')) diff --git a/apps/assets/templates/assets/asset_group_create.html b/apps/assets/templates/assets/asset_group_create.html index fe2238429..55b3d98e4 100644 --- a/apps/assets/templates/assets/asset_group_create.html +++ b/apps/assets/templates/assets/asset_group_create.html @@ -27,22 +27,10 @@
-
+ {% csrf_token %} {{ form.name|bootstrap_horizontal }} {{ form.assets|bootstrap_horizontal }} - -{#
#} -{# #} -{#
#} -{# #} -{#
#} -{#
#} - {{ form.comment|bootstrap_horizontal }}
diff --git a/apps/assets/templates/assets/idc_create.html b/apps/assets/templates/assets/idc_create.html new file mode 100644 index 000000000..b09375bdc --- /dev/null +++ b/apps/assets/templates/assets/idc_create.html @@ -0,0 +1,61 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} +{% load bootstrap %} +{% block custom_head_css_js %} + + +{% endblock %} + +{% block content %} +
+
+
+
+
+
{% trans 'Create idc' %}
+ +
+
+ + {% csrf_token %} + {{ form.name|bootstrap_horizontal }} + {{ form.assets|bootstrap_horizontal }} + {{ form.bandwidth|bootstrap_horizontal }} + {{ form.operator|bootstrap_horizontal }} + {{ form.contact|bootstrap_horizontal }} + {{ form.phone|bootstrap_horizontal }} + {{ form.address|bootstrap_horizontal }} + {{ form.network|bootstrap_horizontal }} + {{ form.comment|bootstrap_horizontal }} + +
+
+ + +
+
+ +
+
+
+
+
+{% endblock %} +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/idc_list.html b/apps/assets/templates/assets/idc_list.html new file mode 100644 index 000000000..4012331fc --- /dev/null +++ b/apps/assets/templates/assets/idc_list.html @@ -0,0 +1,35 @@ +{% extends '_list_base.html' %} +{% load i18n %} +{% load common_tags %} +{% block content_left_head %} + {% trans "Create IDC" %} +{% endblock %} + +{% block table_head %} + {% trans 'ID' %} + {% trans 'Name' %} + {% trans 'Asset num' %} + {% trans 'Bandwidth' %} + {% trans 'Contact' %} + {% trans 'Phone' %} + {% trans 'Address' %} + +{% endblock %} + +{% block table_body %} + {% for idc in idc_list %} + + {{ idc.id }} + {{ idc.name }} + {{ idc.assets.count }} + {{ idc.bandwidth }} + {{ idc.contact }} + {{ idc.phone }} + {{ idc.address }} + + {% trans 'Update' %} + {% trans 'Delete' %} + + + {% endfor %} +{% endblock %} diff --git a/apps/assets/urls.py b/apps/assets/urls.py index 68279389a..821fe144d 100644 --- a/apps/assets/urls.py +++ b/apps/assets/urls.py @@ -16,12 +16,17 @@ urlpatterns = [ url(r'^asset$', views.AssetListView.as_view(), name='asset-list'), url(r'^asset/create$', views.AssetCreateView.as_view(), name='asset-create'), url(r'^asset/(?P[0-9]+)$', views.AssetDetailView.as_view(), name='asset-detail'), - url(r'^asset/(?P[0-9]+)$/update', views.AssetUpdateView.as_view(), name='asset-update'), + url(r'^asset/(?P[0-9]+)/update', views.AssetUpdateView.as_view(), name='asset-update'), url(r'^asset/(?P[0-9]+)/delete$', views.AssetDeleteView.as_view(), name='asset-delete'), url(r'^asset-group$', views.AssetGroupListView.as_view(), name='asset-group-list'), url(r'^asset-group/create$', views.AssetGroupCreateView.as_view(), name='asset-group-create'), url(r'^asset-group/(?P[0-9]+)$', views.AssetGroupDetailView.as_view(), name='asset-group-detail'), url(r'^asset-group/(?P[0-9]+)/update$', views.AssetGroupUpdateView.as_view(), name='asset-group-update'), url(r'^asset-group/(?P[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='asset-group-delete'), + url(r'^idc$', views.IDCListView.as_view(), name='idc-list'), + url(r'^idc/create$', views.IDCCreateView.as_view(), name='idc-create'), + url(r'^idc/(?P[0-9]+)$', views.IDCDetailView.as_view(), name='idc-detail'), + url(r'^idc/(?P[0-9]+)/update', views.IDCUpdateView.as_view(), name='idc-update'), + url(r'^idc/(?P[0-9]+)/delete$', views.IDCDeleteView.as_view(), name='idc-delete'), # url(r'^api/v1.0/', include(router.urls)), ] diff --git a/apps/assets/views.py b/apps/assets/views.py index 958033e4a..16c54214c 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -14,7 +14,7 @@ from django.urls import reverse_lazy from django.views.generic.detail import DetailView, SingleObjectMixin from .models import Asset, AssetGroup, IDC, AssetExtend -from .forms import AssetForm, AssetGroupForm +from .forms import AssetForm, AssetGroupForm, IDCForm from .utils import AdminUserRequiredMixin @@ -142,3 +142,59 @@ class AssetGroupDeleteView(DeleteView): template_name = 'assets/delete_confirm.html' model = AssetGroup success_url = reverse_lazy('assets:asset-group-list') + + +class IDCListView(ListView): + model = IDC + paginate_by = settings.CONFIG.DISPLAY_PER_PAGE + context_object_name = 'idc_list' + template_name = 'assets/idc_list.html' + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('IDC list'), + 'keyword': self.request.GET.get('keyword', '') + } + kwargs.update(context) + return super(IDCListView, self).get_context_data(**kwargs) + + def get_queryset(self): + self.queryset = super(IDCListView, self).get_queryset() + self.keyword = keyword = self.request.GET.get('keyword', '') + self.sort = sort = self.request.GET.get('sort', '-date_created') + + if keyword: + self.queryset = self.queryset.filter(Q(name__icontains=keyword) | + Q(comment__icontains=keyword)) + + if sort: + self.queryset = self.queryset.order_by(sort) + return self.queryset + + +class IDCCreateView(CreateView): + model = IDC + form_class = IDCForm + template_name = 'assets/idc_create.html' + success_url = reverse_lazy('assets:idc-list') + + def get_context_data(self, **kwargs): + context = { + 'app': 'assets', + 'action': 'Create IDC' + } + kwargs.update(context) + return super(IDCCreateView, self).get_context_data(**kwargs) + + +class IDCUpdateView(UpdateView): + pass + + +class IDCDetailView(DetailView): + pass + + +class IDCDeleteView(DeleteView): + pass diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 1ad37fead..8f77cb47d 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -20,7 +20,7 @@
-
+ {% csrf_token %}

{% trans 'Account' %}

{% block username %} {% endblock %} diff --git a/apps/users/templates/users/user_group_create.html b/apps/users/templates/users/user_group_create.html index 0b11c9679..6b80c68cd 100644 --- a/apps/users/templates/users/user_group_create.html +++ b/apps/users/templates/users/user_group_create.html @@ -27,7 +27,7 @@
- + {% csrf_token %} {{ form.name|bootstrap_horizontal }}