diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 824ef3fcd..2653ca793 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -2,7 +2,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from .models import Cluster, Asset, AssetGroup, AdminUser, SystemUser +from .models import Cluster, Asset, AssetGroup, AdminUser, SystemUser, Label from common.utils import validate_ssh_private_key, ssh_pubkey_gen, ssh_key_gen, get_logger @@ -10,20 +10,20 @@ logger = get_logger(__file__) class AssetCreateForm(forms.ModelForm): - class Meta: model = Asset fields = [ 'hostname', 'ip', 'public_ip', 'port', 'type', 'comment', 'cluster', 'groups', 'status', 'env', 'is_active', - 'admin_user' + 'admin_user', 'labels' ] widgets = { 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}), 'cluster': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select cluster')}), 'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select admin user')}), - 'port': forms.TextInput() + 'labels': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select labels')}), + 'port': forms.TextInput(), } help_texts = { 'hostname': '* required', @@ -40,6 +40,10 @@ class AssetCreateForm(forms.ModelForm): raise forms.ValidationError(_("You need set a admin user if cluster not have")) return self.cleaned_data['admin_user'] + def save(self, commit=True): + print(self.cleaned_data) + return super().save(commit=commit) + class AssetUpdateForm(forms.ModelForm): class Meta: @@ -47,7 +51,7 @@ class AssetUpdateForm(forms.ModelForm): fields = [ 'hostname', 'ip', 'port', 'groups', "cluster", 'is_active', 'type', 'env', 'status', 'public_ip', 'remote_card_ip', 'cabinet_no', - 'cabinet_pos', 'number', 'comment', 'admin_user', + 'cabinet_pos', 'number', 'comment', 'admin_user', 'labels' ] widgets = { 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}), @@ -68,13 +72,15 @@ class AssetUpdateForm(forms.ModelForm): raise forms.ValidationError(_("You need set a admin user if cluster not have")) return self.cleaned_data['admin_user'] + def save(self, commit=True): + print(self.cleaned_data) + return super().save(commit=commit) + class AssetBulkUpdateForm(forms.ModelForm): assets = forms.ModelMultipleChoiceField( - required=True, - help_text='* required', - label=_('Select assets'), - queryset=Asset.objects.all(), + required=True, help_text='* required', + label=_('Select assets'), queryset=Asset.objects.all(), widget=forms.SelectMultiple( attrs={ 'class': 'select2', @@ -83,10 +89,7 @@ class AssetBulkUpdateForm(forms.ModelForm): ) ) port = forms.IntegerField( - label=_('Port'), - required=False, - min_value=1, - max_value=65535, + label=_('Port'), required=False, min_value=1, max_value=65535, ) class Meta: @@ -96,7 +99,9 @@ class AssetBulkUpdateForm(forms.ModelForm): 'type', 'env', ] widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')}), + 'groups': forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select asset groups')} + ), } def save(self, commit=True): @@ -140,7 +145,7 @@ class AssetGroupForm(forms.ModelForm): def save(self, commit=True): group = super().save(commit=commit) - assets= self.cleaned_data['assets'] + assets = self.cleaned_data['assets'] group.assets.set(assets) return group @@ -377,3 +382,22 @@ class SystemUserAuthForm(forms.Form): class FileForm(forms.Form): file = forms.FileField() + + +class LabelForm(forms.ModelForm): + assets = forms.ModelMultipleChoiceField( + queryset=Asset.objects.all(), label=_('Asset'), required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')} + ) + ) + + class Meta: + model = Label + fields = ['name', 'value', 'assets'] + + def save(self, commit=True): + label = super().save(commit=commit) + assets = self.cleaned_data['assets'] + label.assets.set(assets) + return label diff --git a/apps/assets/models/label.py b/apps/assets/models/label.py index f7d341d6c..990a71ca8 100644 --- a/apps/assets/models/label.py +++ b/apps/assets/models/label.py @@ -23,8 +23,15 @@ class Label(models.Model): auto_now_add=True, null=True, blank=True, verbose_name=_('Date created') ) + @classmethod + def get_queryset_group_by_name(cls): + names = cls.objects.values_list('name', flat=True) + for name in names: + yield name, cls.objects.filter(name=name) + def __str__(self): return "{}:{}".format(self.name, self.value) class Meta: db_table = "assets_label" + unique_together = ('name', 'value') diff --git a/apps/assets/templates/assets/asset_create.html b/apps/assets/templates/assets/asset_create.html index f96f1b0fb..8378d5f14 100644 --- a/apps/assets/templates/assets/asset_create.html +++ b/apps/assets/templates/assets/asset_create.html @@ -2,6 +2,8 @@ {% load static %} {% load bootstrap3 %} {% load i18n %} +{% load asset_tags %} +{% load common_tags %} {% block form %}
@@ -28,12 +30,32 @@

{% trans 'Group' %}

{% bootstrap_field form.groups layout="horizontal" %} +
+

{% trans 'Labels' %}

+
+ +
+ +
+
+

{% trans 'Other' %}

{% bootstrap_field form.comment layout="horizontal" %} {% bootstrap_field form.is_active layout="horizontal" %} -
diff --git a/apps/assets/templates/assets/asset_update.html b/apps/assets/templates/assets/asset_update.html index b0cbc484b..75801d852 100644 --- a/apps/assets/templates/assets/asset_update.html +++ b/apps/assets/templates/assets/asset_update.html @@ -2,6 +2,8 @@ {% load static %} {% load bootstrap3 %} {% load i18n %} +{% load asset_tags %} +{% load common_tags %} {% block custom_head_css_js_create %} @@ -33,6 +35,27 @@

{% trans 'Group' %}

{% bootstrap_field form.groups layout="horizontal" %} +
+

{% trans 'Labels' %}

+
+ +
+ +
+
+

{% trans 'Configuration' %}

{% bootstrap_field form.number layout="horizontal" %} @@ -62,14 +85,18 @@ {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/label_create_update.html b/apps/assets/templates/assets/label_create_update.html new file mode 100644 index 000000000..358faaab8 --- /dev/null +++ b/apps/assets/templates/assets/label_create_update.html @@ -0,0 +1,31 @@ +{% extends '_base_create_update.html' %} +{% load static %} +{% load bootstrap3 %} +{% load i18n %} + +{% block form %} + + {% csrf_token %} + {% bootstrap_field form.name layout="horizontal" %} + {% bootstrap_field form.value layout="horizontal" %} + {% bootstrap_field form.assets layout="horizontal" %} + +
+
+
+ + +
+
+ +{% endblock %} + +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/label_list.html b/apps/assets/templates/assets/label_list.html index efed4a994..bbe6ae5c1 100644 --- a/apps/assets/templates/assets/label_list.html +++ b/apps/assets/templates/assets/label_list.html @@ -3,7 +3,7 @@ {% block table_search %}{% endblock %} {% block table_container %} diff --git a/apps/assets/templatetags/__init__.py b/apps/assets/templatetags/__init__.py new file mode 100644 index 000000000..ec51c5a2b --- /dev/null +++ b/apps/assets/templatetags/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +# diff --git a/apps/assets/templatetags/asset_tags.py b/apps/assets/templatetags/asset_tags.py index 829ab2a80..15605f835 100644 --- a/apps/assets/templatetags/asset_tags.py +++ b/apps/assets/templatetags/asset_tags.py @@ -1,6 +1,12 @@ +from collections import defaultdict from django import template -from django.utils import timezone -from django.conf import settings register = template.Library() + +@register.filter +def group_labels(queryset): + grouped = defaultdict(list) + for label in queryset: + grouped[label.name].append(label) + return [(name, labels) for name, labels in grouped.items()] diff --git a/apps/assets/urls/views_urls.py b/apps/assets/urls/views_urls.py index 09ff322ee..a63c065cf 100644 --- a/apps/assets/urls/views_urls.py +++ b/apps/assets/urls/views_urls.py @@ -54,5 +54,6 @@ urlpatterns = [ # name='system-user-asset-group'), url(r'^label/$', views.LabelListView.as_view(), name='label-list'), + url(r'^label/create/$', views.LabelCreateView.as_view(), name='label-create'), ] diff --git a/apps/assets/views/label.py b/apps/assets/views/label.py index 375c500a5..e0b489323 100644 --- a/apps/assets/views/label.py +++ b/apps/assets/views/label.py @@ -1,12 +1,14 @@ # -*- coding: utf-8 -*- # -from django.views.generic import ListView, TemplateView, CreateView, \ +from django.views.generic import TemplateView, CreateView, \ UpdateView, DeleteView, DetailView from django.utils.translation import ugettext_lazy as _ - +from django.urls import reverse_lazy from common.mixins import AdminUserRequiredMixin +from common.const import create_success_msg +from ..forms import LabelForm __all__ = ( @@ -28,7 +30,18 @@ class LabelListView(AdminUserRequiredMixin, TemplateView): class LabelCreateView(AdminUserRequiredMixin, CreateView): - pass + template_name = 'assets/label_create_update.html' + form_class = LabelForm + success_url = reverse_lazy('assets:label-list') + success_message = create_success_msg + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Create label'), + } + kwargs.update(context) + return super().get_context_data(**kwargs) class LabelUpdateView(AdminUserRequiredMixin, UpdateView): diff --git a/apps/common/templatetags/common_tags.py b/apps/common/templatetags/common_tags.py index c10c228c8..747868430 100644 --- a/apps/common/templatetags/common_tags.py +++ b/apps/common/templatetags/common_tags.py @@ -92,3 +92,8 @@ def is_bool_field(field): return True else: return False + + +@register.filter +def to_dict(data): + return dict(data) diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 8bc795c9c..256b79a10 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -24,7 +24,7 @@
  • {% trans 'Cluster' %}
  • {% trans 'Admin user' %}
  • {% trans 'System user' %}
  • -
  • {% trans 'Label' %}
  • +
  • {% trans 'Label' %}
  • @@ -54,8 +54,6 @@
  • {% trans 'Command' %}
  • - - {#
  • #} {# #} {# {% trans 'File' %}#}