From d371c0c5ae363685735ab61056c808726802cf48 Mon Sep 17 00:00:00 2001 From: liuzheng712 Date: Sun, 4 Sep 2016 06:55:12 +0800 Subject: [PATCH 01/14] mkdirp --- apps/manage.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/manage.py b/apps/manage.py index 0a67255e8..a721be061 100644 --- a/apps/manage.py +++ b/apps/manage.py @@ -1,8 +1,16 @@ #!/usr/bin/env python import os import sys +import errno if __name__ == "__main__": + try: + os.makedirs('./logs') + except OSError as exc: # Python > 2.5 (except OSError, exec: for Python < 2.5) + if exc.errno == errno.EEXIST and os.path.isdir('./logs'): + pass + else: raise + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") try: from django.core.management import execute_from_command_line From 32c49c080cfde7cbfaeeb045e3957e9493dcc514 Mon Sep 17 00:00:00 2001 From: liuzheng712 Date: Sun, 4 Sep 2016 07:04:15 +0800 Subject: [PATCH 02/14] update --- apps/manage.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/manage.py b/apps/manage.py index a721be061..d24c5fd38 100644 --- a/apps/manage.py +++ b/apps/manage.py @@ -5,11 +5,9 @@ import errno if __name__ == "__main__": try: - os.makedirs('./logs') - except OSError as exc: # Python > 2.5 (except OSError, exec: for Python < 2.5) - if exc.errno == errno.EEXIST and os.path.isdir('./logs'): - pass - else: raise + os.makedirs('../logs') + except: + pass os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jumpserver.settings") try: From 724b1c6fd4a7688b0d1795201c76b008d2de3313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B9=BF=E5=AE=8F=E4=BC=9F?= Date: Sun, 4 Sep 2016 12:37:42 +0800 Subject: [PATCH 03/14] Add new directory logs --- logs/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 logs/.gitkeep diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 000000000..e69de29bb From 4855e86a3fe9062c9306a32e71068cc31e45c827 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 4 Sep 2016 21:47:10 +0800 Subject: [PATCH 04/14] Add asset group view --- apps/assets/models.py | 4 ++++ apps/assets/templates/assets/assetgroup_add.html | 6 +++--- apps/assets/templates/assets/assetgroup_list.html | 12 ++++++------ apps/assets/urls.py | 2 +- apps/assets/views.py | 1 + apps/templates/_header_bar.html | 2 +- apps/users/locale/zh_CN/LC_MESSAGES/django.po | 2 +- apps/users/templates/users/_user.html | 2 +- apps/users/templates/users/forget_password.html | 2 +- apps/users/templates/users/user_list.html | 2 +- 10 files changed, 20 insertions(+), 15 deletions(-) diff --git a/apps/assets/models.py b/apps/assets/models.py index 740c2445e..5098e052c 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -130,8 +130,12 @@ class Asset(models.Model): def __unicode__(self): return self.ip + def initial(self): + pass + class Meta: db_table = 'asset' + index_together = ('ip', 'port') class Label(models.Model): diff --git a/apps/assets/templates/assets/assetgroup_add.html b/apps/assets/templates/assets/assetgroup_add.html index 112eb0484..4c032c0a8 100644 --- a/apps/assets/templates/assets/assetgroup_add.html +++ b/apps/assets/templates/assets/assetgroup_add.html @@ -36,7 +36,7 @@
@@ -46,8 +46,8 @@
- - + +
diff --git a/apps/assets/templates/assets/assetgroup_list.html b/apps/assets/templates/assets/assetgroup_list.html index 51605a549..8fb196681 100644 --- a/apps/assets/templates/assets/assetgroup_list.html +++ b/apps/assets/templates/assets/assetgroup_list.html @@ -19,18 +19,18 @@ {% for assetgroup in assetgroups %} - + - + {{ assetgroup.name }} - {{ assetgroup.comment }} + {{ assetgroup.asset_set.count }} {{ assetgroup.comment }} - {% trans 'Edit' %} - {% trans 'Delete' %} + {% trans 'Edit' %} + {% trans 'Delete' %} {% endfor %} @@ -48,7 +48,7 @@
diff --git a/apps/assets/urls.py b/apps/assets/urls.py index 8b92accb4..53bf3beab 100644 --- a/apps/assets/urls.py +++ b/apps/assets/urls.py @@ -22,7 +22,7 @@ urlpatterns = [ url(r'^assetgroup$', views.AssetGroupListView.as_view(), name='assetgroup-list'), url(r'^assetgroup/add$', views.AssetGroupAddView.as_view(), name='assetgroup-add'), url(r'^assetgroup/(?P[0-9]+)$', views.AssetGroupDetailView.as_view(), name='assetgroup-detail'), - url(r'^assetgroup/(?P[0-9]+)$/edit', views.AssetGroupEditView.as_view(), name='assetgroup-edit'), + url(r'^assetgroup/(?P[0-9]+)/edit$', views.AssetGroupEditView.as_view(), name='assetgroup-edit'), url(r'^assetgroup/(?P[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='assetgroup-delete'), # url(r'^api/v1.0/', include(router.urls)), ] diff --git a/apps/assets/views.py b/apps/assets/views.py index 246aeddf0..7eb868a72 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -52,6 +52,7 @@ class AssetGroupAddView(CreateView): model = AssetGroup form_class = AssetGroupForm template_name = 'assets/assetgroup_add.html' + success_url = reverse_lazy('assets:assetgroup-list') def get_context_data(self, **kwargs): context = { diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index 012b6f013..66699be53 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -11,7 +11,7 @@ diff --git a/apps/templates/captcha/text_field.html b/apps/templates/captcha/text_field.html index abf2a6fd4..413eb1893 100644 --- a/apps/templates/captcha/text_field.html +++ b/apps/templates/captcha/text_field.html @@ -1,7 +1,7 @@ +{% load i18n %}
- - +

diff --git a/apps/users/templates/users/login.html b/apps/users/templates/users/login.html index b2cc09668..40dc48e0f 100644 --- a/apps/users/templates/users/login.html +++ b/apps/users/templates/users/login.html @@ -11,6 +11,11 @@ {% include '_head_css_js.html' %} + From 7241f7509fec9909c739918bfc24844002eac945 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 5 Sep 2016 20:27:44 +0800 Subject: [PATCH 09/14] Update nav --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 8840 -> 8934 bytes apps/locale/zh/LC_MESSAGES/django.po | 92 ++++++++++++++++----------- apps/templates/_foot_js.html | 2 +- apps/templates/_nav.html | 26 ++++---- apps/users/forms.py | 2 +- 5 files changed, 69 insertions(+), 53 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 08bde2ecf08285d72387dbc136d365065aea1254..e6457f782439fe50578c1a100eb53a7e47fe1b4d 100644 GIT binary patch delta 3167 zcmZA2drVhl9LMno1SGrwDr8>Zhsm`PZ>V`IMM_gM^HSbYQ4kV^K)mabQbeIy{T8i@ zGeOgTT)G9hp=~;InMLWcw5e=eTrFF!_vd%M{?jwQyq@oK&Uv2idCu?rel>Yl z^SmFrMZE54bwnRxV}x@juq~Q@v~M~&cRtLyi?|yPb#bmE<5Oati^7@M0q3E{7h+dj zhB3Grxx`grChoHFqZsL&=UV8*bKn%RhHJw(`~^GX-*^v3F{nJw?2B3;3sp#tIU03- zF808wHlA6{8AYFInGhqoX@}1$E(W?oqw9L1uFFC_ifq(6W6(>ZGl`B)EJK~R#oUJa80D#&&B^G>K6i|@|!`$|l(fvrq-iM?H$gr~-;ng_W3< z=4RA<+mTIh^{DIjqY61_Hre>m?(DxNKF)w9Jc)V~XHXNhp)S0EL-02nPvw)9NIn!F z#L1|wU5i?<8nvUfsCnK--SGibVU4JDnmrphixU|55%pn8Pw*$qMHM(5Rp1;{LHVc& zi%<)eTD}UkgBvgvw_{H{h_D&SRQ9?$KiGnFrv!`Om%?&X!l=KK5$7qA_gV5zy> zEJsbW4z-m#PzBaw2EJ?Kt*Gn2w)}h4dDk&k@Bb|uh~PFfQCG9KnPKLb<53e%vwSvE zt6O5@o6N1qCc0Y7_o5!be$+Z2NxlC^>8PTUs5?4~THvxyz-xB=7V;*!JE-&G`})UI z%mJ9j_$buzeAK+mV73pCKtf`{$Erv7P&<)p`5e@Fg-PtcDqO*UTw@2SQ15vSK904hLcc=oz-99f)Rsmi`xC~X&WpD^ z$?{axb%QYr^HA%RC42sb>lsi*Rb~xpqFtyH-$A_v`|S9~s0ojtwz}2EFQTryY(>WWKn4!OY}7=BsD&y}l~<$28&T&UM-}*mc?LCp5krNT?WjU; zV-d#i{PexxRnXA{b*KyL&E2T?`8~@IpuR8~Ek9y@hAOZH`R;NTP>kov!N}s2nN36E7yM$Y(4wJ3F6ju;>*7JxGLTwu{nV7BQ zf9+Yz*Xa4HO(Lce*~G)dKq5elBeoJx6KV^I4Me&U+C-v;*r9~B-N!93d*KwKtL4w& z{lsFTFR@eW4g=Q|M0Lt(}8X^;jya DY=0jo delta 3109 zcmYk;drVhl9LMnoTUHnTS8s;R4uC~dWthPKA0tNwCJ?fp5wFI&(2{$9`b`JMBe?|GizIe2SU z<1FvjxQMqLt%*n?R!2DZCARkDgVxf=xsEXBPT*0jk997Z@ua@aMPUZ^z>%o&JbVZz zU~im_oZ?DwIIgtuCX95>a|h}4=ZhoQ4_h$?&tosVWO;{q9X0W7Q~`HQovh=daRBy5 zeV=9HqcD?v0&-zjjy<@(tDvKb*C78~Eg#J3_M`5o8TI`;mY>8SP#3t2 zI`2o+dACqY--RmhE@ojQRqMDM^mJe$9a)6h_SvXCU5Meh81t|cRX_vk&JLg^I)*y_ zV^m?MQ3ai|{43OrT|uqn_n3w^;#hxG77-shpdYG`MD%}Tr~)!jg=L$g%}J;UXCOD{ zN>JxlpbA-QZnE(j)Vy`5`F6*%{@ROI7|=w`s1rZH0&KPM-!Osv4(4DKzc4Lr0s1S4 zT8Y`Hc}h`t96%Me0d<{v%U{Kr+ z^I}m2CSWQiqb@uZHO~TE!TX~eFXGum=MIOl|2qeVPE2GOG(n1)Y386NDnKn^F{>L${dRVl<~ms`HhtVT~0?684-sOR!E)c8sBoPGa|<=>gVpjO~d%O9XF7?TnzFy2f? zjc21C=UjXY^HbP=U8s%$tw4i$7`2qGs1r}2jyq%dMawUv&bx*qunV=<2}48YrJC7h zE^3}}sN-e~^+Lbi`F6k()P!ZIt*Ekb4|QUL)qq6&Q%*WxME^FNq<)cIpj=M|d8sK<7m z<=!GXdNC|TO*YdHb3l!lD`A$eYWYK7QgR> zUcXC8wiAWKGGZ(-no!d|s*NF56Ele#Vg}Jjj3c^RJ{_&5-uY^JrR#P6Fi}dpKm>>a zVh1st>$^2XHKDeVs32ZaVl4}`^lI9Qt;91*Xgdkbp{75{^Zj1vN3HH8qBk*_m`KzT z&l9@{{UE(3_{b)-*Lt0Hw+!nH!ztFEii?Rd%e5`tty8|x;# zyY?nVQfzb;t|zqD%ZYV_+8$yq@stwUtPuWZ{r~#v>gDn{F^ZT##{O>GI0Myw=wJG=cv9O3w-*-@yh;66s}1}A>CjW6wtz?{^f(1SjLm5Kw@+7(;6Ht@wzc<53U9j;*BBm? zx@2o$i(6c`wI;AJ*f6j*7@g1=Te)i6hQOBT)z!HbRU3m{2}2|E$4t&IXzQEU84\n" "Language-Team: Jumpserver team\n" @@ -82,7 +82,7 @@ msgid "VALUE" msgstr "VALUE" #: assets/models.py:55 assets/models.py:77 users/forms.py:12 -#: users/models.py:106 users/templates/users/login.html:58 +#: users/models.py:106 users/templates/users/login.html:54 #: users/templates/users/user_detail.html:73 #: users/templates/users/user_edit.html:5 #: users/templates/users/user_list.html:13 @@ -90,7 +90,7 @@ msgid "Username" msgstr "用户名" #: assets/models.py:56 assets/models.py:78 users/forms.py:13 -#: users/templates/users/login.html:61 +#: users/templates/users/login.html:57 #: users/templates/users/reset_password.html:52 #: users/templates/users/user_add.html:8 users/templates/users/user_add.html:10 #: users/templates/users/user_edit.html:12 @@ -162,7 +162,7 @@ msgstr "端口" msgid "Asset groups" msgstr "用户组" -#: assets/models.py:107 +#: assets/models.py:107 assets/models.py:109 templates/_nav.html:24 msgid "Admin user" msgstr "管理用户" @@ -170,10 +170,6 @@ msgstr "管理用户" msgid "Admin password" msgstr "管理员密码" -#: assets/models.py:110 -msgid "Sys User" -msgstr "系统用户" - #: assets/models.py:111 templates/_nav.html:23 msgid "IDC" msgstr "机房" @@ -318,8 +314,8 @@ msgstr "欢迎使用Jumpserver开源跳板机系统" msgid "Help" msgstr "帮助" -#: templates/_nav.html:9 users/views.py:102 users/views.py:115 -#: users/views.py:159 users/views.py:176 users/views.py:201 users/views.py:214 +#: templates/_nav.html:9 users/views.py:100 users/views.py:113 +#: users/views.py:153 users/views.py:170 users/views.py:195 users/views.py:208 msgid "Users" msgstr "用户管理" @@ -327,12 +323,18 @@ msgstr "用户管理" msgid "User" msgstr "用户" -#: templates/_nav.html:13 users/models.py:109 -#: users/templates/users/user_detail.html:181 -#: users/templates/users/user_list.html:15 -msgid "Usergroup" +#: templates/_nav.html:13 +msgid "User group" msgstr "用户组" +#: templates/_nav.html:22 +msgid "Asset group" +msgstr "资产组" + +#: templates/_nav.html:25 +msgid "System user" +msgstr "系统" + #: templates/_nav.html:26 msgid "Label" msgstr "标签" @@ -385,8 +387,12 @@ msgstr "注销登录" msgid "Play CAPTCHA as audio file" msgstr "" +#: templates/captcha/text_field.html:4 +msgid "Captcha" +msgstr "验证码" + #: users/forms.py:31 users/forms.py:50 -msgid "Join usergroups" +msgid "Join user groups" msgstr "添加到用户组" #: users/models.py:102 users/models.py:225 @@ -397,6 +403,11 @@ msgstr "管理员" msgid "Email" msgstr "邮件" +#: users/models.py:109 users/templates/users/user_detail.html:181 +#: users/templates/users/user_list.html:15 +msgid "Usergroup" +msgstr "用户组" + #: users/models.py:110 users/templates/users/user_detail.html:93 #: users/templates/users/user_list.html:14 msgid "Role" @@ -434,16 +445,16 @@ msgstr "Administrator是初始的超级管理员" msgid "System" msgstr "系统" -#: users/templates/users/_user.html:18 users/templates/users/user_list.html:5 -#: users/views.py:115 +#: users/templates/users/_user.html:17 users/templates/users/user_list.html:5 +#: users/views.py:113 msgid "Create user" msgstr "创建用户" -#: users/templates/users/_user.html:34 +#: users/templates/users/_user.html:33 msgid "Account" msgstr "账户" -#: users/templates/users/_user.html:44 +#: users/templates/users/_user.html:43 msgid "Security and Role" msgstr "角色安全" @@ -455,11 +466,11 @@ msgstr "忘记密码" msgid "Input your email, that will send a mail to your" msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中" -#: users/templates/users/login.html:46 users/templates/users/login.html:66 +#: users/templates/users/login.html:42 users/templates/users/login.html:62 msgid "Login" msgstr "登录" -#: users/templates/users/login.html:51 +#: users/templates/users/login.html:47 msgid "Captcha invalid" msgstr "验证码错误" @@ -484,7 +495,7 @@ msgstr "生成重置密码连接,通过邮件发送给用户" msgid "Confirm delete" msgstr "确认删除" -#: users/templates/users/user_detail.html:18 users/views.py:176 +#: users/templates/users/user_detail.html:18 users/views.py:170 msgid "User detail" msgstr "用户详情" @@ -625,64 +636,69 @@ msgstr "" "
\n" " " -#: users/views.py:55 +#: users/views.py:53 msgid "Username or password invalid" msgstr "用户名或密码错误" -#: users/views.py:72 +#: users/views.py:70 msgid "Logout success" msgstr "退出登录成功" -#: users/views.py:73 +#: users/views.py:71 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" -#: users/views.py:102 +#: users/views.py:100 msgid "User list" msgstr "用户列表" -#: users/views.py:111 +#: users/views.py:109 #, python-format msgid "Create user%s success." msgstr "创建用户%s 成功" -#: users/views.py:159 +#: users/views.py:153 msgid "Edit user" msgstr "编辑用户" -#: users/views.py:201 +#: users/views.py:195 msgid "Usergroup list" msgstr "用户组列表" -#: users/views.py:214 +#: users/views.py:208 msgid "Create usergroup" msgstr "创建用户组" -#: users/views.py:246 +#: users/views.py:240 msgid "Email address invalid, input again" msgstr "邮箱地址错误,重新输入" -#: users/views.py:257 +#: users/views.py:251 msgid "Send reset password message" msgstr "发送重置密码邮件" -#: users/views.py:258 +#: users/views.py:252 msgid "Send reset password mail success, login your mail box and follow it " msgstr "" "发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" -#: users/views.py:270 +#: users/views.py:264 msgid "Reset password success" msgstr "重置密码成功" -#: users/views.py:271 +#: users/views.py:265 msgid "Reset password success, return to login page" msgstr "重置密码成功,返回到登录页面" -#: users/views.py:287 users/views.py:300 +#: users/views.py:281 users/views.py:294 msgid "Token invalid or expired" msgstr "Token错误或失效" -#: users/views.py:296 +#: users/views.py:290 msgid "Password not same" msgstr "密码不一致" + +#, fuzzy +#~| msgid "Asset groups" +#~ msgid "Assetgroup" +#~ msgstr "用户组" diff --git a/apps/templates/_foot_js.html b/apps/templates/_foot_js.html index 1b81e3406..415244754 100644 --- a/apps/templates/_foot_js.html +++ b/apps/templates/_foot_js.html @@ -15,7 +15,7 @@ $('#index').addClass('active') } else { $("#"+s1).addClass('active'); - $('#'+s1+' .'+s2).addClass('active'); + $('#'+s1+' #'+s2).addClass('active'); } function getCookie(name) { diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 969420674..2c3169361 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -9,30 +9,30 @@ {% trans 'Users' %} -
  • +
  • {% trans 'Assets' %}
  • {% trans 'Perms' %} @@ -47,8 +47,8 @@ {% trans 'File' %}
  • diff --git a/apps/users/forms.py b/apps/users/forms.py index 88b6ccd93..e388fa400 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -28,7 +28,7 @@ class UserAddForm(ModelForm): } widgets = { - 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join usergroups')}), + 'groups': forms.SelectMultiple(attrs={'class': 'select2', 'data-placeholder': _('Join user groups')}), } From 2f5b7ad654c45940d73daff6b270b22e1750db5c Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 5 Sep 2016 22:57:43 +0800 Subject: [PATCH 10/14] Modify asset model --- apps/assets/models.py | 2 +- apps/users/templates/users/usergroup_add.html | 3 ++- apps/users/templates/users/usergroup_list.html | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/assets/models.py b/apps/assets/models.py index 1b336c33e..c9720601f 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -128,7 +128,7 @@ class Asset(models.Model): comment = models.CharField(max_length=128, null=True, blank=True, verbose_name=_('Comment')) def __unicode__(self): - return self.ip + return '%(ip)s:%(port)d' % {'ip': self.ip, 'port': self.port} def initial(self): pass diff --git a/apps/users/templates/users/usergroup_add.html b/apps/users/templates/users/usergroup_add.html index d2e50da49..0b11c9679 100644 --- a/apps/users/templates/users/usergroup_add.html +++ b/apps/users/templates/users/usergroup_add.html @@ -1,5 +1,6 @@ {% extends 'base.html' %} {% load static %} +{% load i18n %} {% load bootstrap %} {% block custom_head_css_js %} @@ -12,7 +13,7 @@
    -
    填写用户组信息
    +
    {% trans 'Create user group' %}
    diff --git a/apps/users/templates/users/usergroup_list.html b/apps/users/templates/users/usergroup_list.html index 012c04a50..2e5522b3c 100644 --- a/apps/users/templates/users/usergroup_list.html +++ b/apps/users/templates/users/usergroup_list.html @@ -1,4 +1,5 @@ {% extends '_list_base.html' %} +{% load i18n %} {% load common_tags %} {% block content_left_head %} 添加用户组 From 2cb6b15bc31443aaace80803429387b9dff4f589 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 5 Sep 2016 23:12:01 +0800 Subject: [PATCH 11/14] set textarea rows --- apps/templates/_foot_js.html | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/templates/_foot_js.html b/apps/templates/_foot_js.html index 415244754..ca20a0423 100644 --- a/apps/templates/_foot_js.html +++ b/apps/templates/_foot_js.html @@ -6,18 +6,19 @@ - \ No newline at end of file From 126d7fd62c18e24bd5dd7fc30f79f47ee30a6057 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 6 Sep 2016 00:49:42 +0800 Subject: [PATCH 12/14] Add asset group add Form m2m --- apps/assets/forms.py | 15 ++++++++++++++- apps/assets/models.py | 2 +- apps/assets/templates/assets/asset_add.html | 10 ---------- .../templates/assets/assetgroup_add.html | 1 + .../templates/assets/assetgroup_list.html | 2 +- apps/assets/views.py | 18 +++++++++++++++--- 6 files changed, 32 insertions(+), 16 deletions(-) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 90283c37a..24d68e02c 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _ class AssetForm(forms.ModelForm): - class Meta: model = Asset @@ -22,6 +21,20 @@ class AssetForm(forms.ModelForm): class AssetGroupForm(forms.ModelForm): + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all()) + + def __init__(self, *args, **kwargs): + if kwargs.get('instance'): + initial = kwargs.get('initial', {}) + initial['assets'] = kwargs['instance'].assets.all() + super(AssetGroupForm, self).__init__(*args, **kwargs) + + def _save_m2m(self): + super(AssetGroupForm, self)._save_m2m() + assets = self.cleaned_data['assets'] + self.instance.assets.clear() + self.instance.assets.add(*tuple(assets)) + class Meta: model = AssetGroup fields = [ diff --git a/apps/assets/models.py b/apps/assets/models.py index c9720601f..f29c2a5f2 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -103,7 +103,7 @@ class Asset(models.Model): remote_card_ip = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Remote card IP')) hostname = models.CharField(max_length=128, unique=True, null=True, blank=True, verbose_name=_('Hostname')) port = models.IntegerField(null=True, blank=True, verbose_name=_('Port')) - groups = models.ManyToManyField(AssetGroup, null=True, blank=True, verbose_name=_('Asset groups')) + groups = models.ManyToManyField(AssetGroup, related_name='assets', verbose_name=_('Asset groups')) username = models.CharField(max_length=16, null=True, blank=True, verbose_name=_('Admin user')) password = models.CharField(max_length=256, null=True, blank=True, verbose_name=_("Admin password")) admin_user = models.ForeignKey(AdminUser, null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_("Admin user")) diff --git a/apps/assets/templates/assets/asset_add.html b/apps/assets/templates/assets/asset_add.html index 5a265253d..fd684a31e 100644 --- a/apps/assets/templates/assets/asset_add.html +++ b/apps/assets/templates/assets/asset_add.html @@ -44,18 +44,8 @@
    - -{#
    #} -{# #} -{#
    #} -{# #} -{#
    #} -{#
    #} - {{ form.type|bootstrap_horizontal }} - {{ form.comment|bootstrap_horizontal }} -

    关联资产用户

    diff --git a/apps/assets/templates/assets/assetgroup_add.html b/apps/assets/templates/assets/assetgroup_add.html index 4c032c0a8..0812d8e80 100644 --- a/apps/assets/templates/assets/assetgroup_add.html +++ b/apps/assets/templates/assets/assetgroup_add.html @@ -30,6 +30,7 @@
    {% csrf_token %} {{ form.name|bootstrap_horizontal }} +{# {{ form.assets|bootstrap_horizontal }}#}
    diff --git a/apps/assets/templates/assets/assetgroup_list.html b/apps/assets/templates/assets/assetgroup_list.html index 8fb196681..bc21bc8d5 100644 --- a/apps/assets/templates/assets/assetgroup_list.html +++ b/apps/assets/templates/assets/assetgroup_list.html @@ -26,7 +26,7 @@ {{ assetgroup.name }} - {{ assetgroup.asset_set.count }} + {{ assetgroup.assets.count }} {{ assetgroup.comment }} {% trans 'Edit' %} diff --git a/apps/assets/views.py b/apps/assets/views.py index 7eb868a72..9f2150956 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -2,17 +2,17 @@ from __future__ import absolute_import, unicode_literals from django.utils.translation import ugettext as _ +from django.shortcuts import get_object_or_404 from django.views.generic import TemplateView, ListView from django.urls import reverse_lazy from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView - from django.views.generic import TemplateView, ListView from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from django.urls import reverse_lazy from django.views.generic.detail import DetailView + from .models import Asset, AssetGroup, IDC, AssetExtend from .forms import AssetForm, AssetGroupForm - from .utils import AdminUserRequiredMixin @@ -83,7 +83,19 @@ class AssetGroupDetailView(DetailView): class AssetGroupEditView(UpdateView): - pass + model = AssetGroup + form_class = AssetGroupForm + template_name = 'assets/assetgroup_add.html' + success_url = reverse_lazy('assets:assetgroup-list') + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Create asset group'), + 'assets': Asset.objects.all(), + } + kwargs.update(context) + return super(AssetGroupEditView, self).get_context_data(**kwargs) class AssetGroupDeleteView(DeleteView): From b8c10a0350735271aab16b95931f9d1a2dcdf062 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 6 Sep 2016 01:09:03 +0800 Subject: [PATCH 13/14] Add assetgroup form save action --- apps/assets/forms.py | 5 ++++- .../templates/assets/assetgroup_add.html | 22 +++++++++---------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 24d68e02c..6fc50849e 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -21,7 +21,10 @@ class AssetForm(forms.ModelForm): class AssetGroupForm(forms.ModelForm): - assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all()) + assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), + widget=forms.SelectMultiple(attrs={ + 'class': 'select2', + 'data-placeholder': _('Select assets')})) def __init__(self, *args, **kwargs): if kwargs.get('instance'): diff --git a/apps/assets/templates/assets/assetgroup_add.html b/apps/assets/templates/assets/assetgroup_add.html index 0812d8e80..fe2238429 100644 --- a/apps/assets/templates/assets/assetgroup_add.html +++ b/apps/assets/templates/assets/assetgroup_add.html @@ -30,18 +30,18 @@ {% csrf_token %} {{ form.name|bootstrap_horizontal }} -{# {{ form.assets|bootstrap_horizontal }}#} + {{ form.assets|bootstrap_horizontal }} -
    - -
    - -
    -
    +{#
    #} +{# #} +{#
    #} +{# #} +{#
    #} +{#
    #} {{ form.comment|bootstrap_horizontal }} From 02b5483d814f7a4a924fa76c4d6413dc53f656c3 Mon Sep 17 00:00:00 2001 From: ibuler Date: Tue, 6 Sep 2016 14:38:19 +0800 Subject: [PATCH 14/14] Update add->create edit->update and assetgrou->asset-grou etc format --- apps/assets/forms.py | 8 +- apps/assets/migrations/0001_initial.py | 160 +++++++++++++----- .../migrations/0002_auto_20160821_1757.py | 20 --- .../migrations/0003_auto_20160821_1759.py | 20 --- apps/assets/models.py | 2 +- .../{asset_add.html => asset_create.html} | 0 ...group_add.html => asset_group_create.html} | 0 ...tgroup_list.html => asset_group_list.html} | 24 ++- apps/assets/templates/assets/asset_list.html | 3 +- apps/assets/urls.py | 14 +- apps/assets/views.py | 32 ++-- apps/templates/_nav.html | 4 +- apps/templates/_user_profile.html | 2 +- apps/users/forms.py | 2 +- apps/users/models.py | 2 +- apps/users/serializers.py | 2 +- .../users/{user_add.html => user_create.html} | 0 ...rgroup_add.html => user_group_create.html} | 0 ...ergroup_list.html => user_group_list.html} | 20 +-- apps/users/templates/users/user_list.html | 4 +- .../{user_edit.html => user_update.html} | 0 apps/users/tests/test_views.py | 2 +- apps/users/urls.py | 18 +- apps/users/views.py | 38 ++--- docs/python_style_guide.md | 5 +- 25 files changed, 211 insertions(+), 171 deletions(-) delete mode 100644 apps/assets/migrations/0002_auto_20160821_1757.py delete mode 100644 apps/assets/migrations/0003_auto_20160821_1759.py rename apps/assets/templates/assets/{asset_add.html => asset_create.html} (100%) rename apps/assets/templates/assets/{assetgroup_add.html => asset_group_create.html} (100%) rename apps/assets/templates/assets/{assetgroup_list.html => asset_group_list.html} (60%) rename apps/users/templates/users/{user_add.html => user_create.html} (100%) rename apps/users/templates/users/{usergroup_add.html => user_group_create.html} (100%) rename apps/users/templates/users/{usergroup_list.html => user_group_list.html} (66%) rename apps/users/templates/users/{user_edit.html => user_update.html} (100%) diff --git a/apps/assets/forms.py b/apps/assets/forms.py index 6fc50849e..1338a7449 100644 --- a/apps/assets/forms.py +++ b/apps/assets/forms.py @@ -22,9 +22,11 @@ class AssetForm(forms.ModelForm): class AssetGroupForm(forms.ModelForm): assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(), - widget=forms.SelectMultiple(attrs={ - 'class': 'select2', - 'data-placeholder': _('Select assets')})) + label=_('Asset'), + required=False, + widget=forms.SelectMultiple( + attrs={'class': 'select2', 'data-placeholder': _('Select assets')}) + ) def __init__(self, *args, **kwargs): if kwargs.get('instance'): diff --git a/apps/assets/migrations/0001_initial.py b/apps/assets/migrations/0001_initial.py index dc20ec9f1..e2ae4c8a1 100644 --- a/apps/assets/migrations/0001_initial.py +++ b/apps/assets/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.10 on 2016-09-03 14:30 +# Generated by Django 1.10 on 2016-09-05 12:50 from __future__ import unicode_literals from django.db import migrations, models @@ -14,31 +14,50 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='AdminUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, max_length=128, null=True, unique=True, verbose_name='Name')), + ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='Username')), + ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Password')), + ('private_key', models.CharField(blank=True, max_length=4096, null=True, verbose_name='SSH private key')), + ('is_default', models.BooleanField(default=True, verbose_name='As default')), + ('auto_update', models.BooleanField(default=True, verbose_name='Auto update pass/key')), + ('date_added', models.DateTimeField(auto_now=True, null=True)), + ('create_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), + ], + options={ + 'db_table': 'adminuser', + }, + ), migrations.CreateModel( name='Asset', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ip', models.CharField(blank=True, max_length=32, verbose_name='\u8d44\u4ea7IP')), - ('other_ip', models.CharField(blank=True, max_length=255, verbose_name='\u5176\u4ed6IP')), - ('remote_card_ip', models.CharField(blank=True, max_length=16, verbose_name='\u8fdc\u63a7\u5361IP')), - ('hostname', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u4e3b\u673a\u540d')), - ('port', models.IntegerField(blank=True, verbose_name='\u7aef\u53e3')), - ('username', models.CharField(blank=True, max_length=16, verbose_name='\u7ba1\u7406\u7528\u6237\u540d')), - ('password', models.CharField(blank=True, max_length=256, verbose_name='\u5bc6\u7801')), - ('mac_addr', models.CharField(blank=True, max_length=20, unique=True, verbose_name='MAC\u5730\u5740')), - ('brand', models.CharField(blank=True, max_length=64, verbose_name='\u786c\u4ef6\u5382\u5546\u578b\u53f7')), - ('cpu', models.CharField(blank=True, max_length=64, verbose_name='CPU')), - ('memory', models.CharField(blank=True, max_length=128, verbose_name='\u5185\u5b58')), - ('disk', models.CharField(blank=True, max_length=1024, verbose_name='\u786c\u76d8')), - ('os', models.CharField(blank=True, max_length=128, verbose_name='\u7cfb\u7edf\u4fe1\u606f')), - ('cabinet_no', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u67dc\u53f7')), - ('cabinet_pos', models.IntegerField(blank=True, null=True, verbose_name='\u8d44\u4ea7\u4f4d\u7f6e')), - ('number', models.CharField(blank=True, max_length=32, unique=True, verbose_name='\u8d44\u4ea7\u7f16\u53f7')), - ('sn', models.CharField(blank=True, max_length=128, unique=True, verbose_name='SN\u7f16\u53f7')), - ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), - ('is_active', models.BooleanField(default=True, verbose_name='\u662f\u5426\u6fc0\u6d3b')), - ('date_added', models.DateTimeField(auto_now=True, null=True)), - ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), + ('ip', models.CharField(blank=True, max_length=32, null=True, verbose_name='IP')), + ('other_ip', models.CharField(blank=True, max_length=255, null=True, verbose_name='Other IP')), + ('remote_card_ip', models.CharField(blank=True, max_length=16, null=True, verbose_name='Remote card IP')), + ('hostname', models.CharField(blank=True, max_length=128, null=True, unique=True, verbose_name='Hostname')), + ('port', models.IntegerField(blank=True, null=True, verbose_name='Port')), + ('username', models.CharField(blank=True, max_length=16, null=True, verbose_name='Admin user')), + ('password', models.CharField(blank=True, max_length=256, null=True, verbose_name='Admin password')), + ('mac_addr', models.CharField(blank=True, max_length=20, null=True, verbose_name='Mac address')), + ('brand', models.CharField(blank=True, max_length=64, null=True, verbose_name='Brand')), + ('cpu', models.CharField(blank=True, max_length=64, null=True, verbose_name='CPU')), + ('memory', models.CharField(blank=True, max_length=128, null=True, verbose_name='Memory')), + ('disk', models.CharField(blank=True, max_length=1024, null=True, verbose_name='Disk')), + ('os', models.CharField(blank=True, max_length=128, null=True, verbose_name='OS')), + ('cabinet_no', models.CharField(blank=True, max_length=32, null=True, verbose_name='Cabinet number')), + ('cabinet_pos', models.IntegerField(blank=True, null=True, verbose_name='Cabinet position')), + ('number', models.CharField(blank=True, max_length=32, null=True, unique=True, verbose_name='Asset number')), + ('sn', models.CharField(blank=True, max_length=128, null=True, unique=True, verbose_name='Serial number')), + ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('is_active', models.BooleanField(default=True, verbose_name='Is active')), + ('date_added', models.DateTimeField(auto_now=True, null=True, verbose_name='Date added')), + ('comment', models.CharField(blank=True, max_length=128, null=True, verbose_name='Comment')), + ('admin_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.AdminUser', verbose_name='Admin user')), ], options={ 'db_table': 'asset', @@ -48,15 +67,23 @@ class Migration(migrations.Migration): name='AssetExtend', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(blank=True, max_length=64, null=True, verbose_name='KEY')), + ('value', models.CharField(blank=True, max_length=64, null=True, verbose_name='VALUE')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('date_added', models.DateTimeField(auto_now=True, null=True)), + ('comment', models.TextField(blank=True, verbose_name='Comment')), ], + options={ + 'db_table': 'assetextend', + }, ), migrations.CreateModel( name='AssetGroup', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=64, unique=True)), - ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), - ('comment', models.CharField(blank=True, max_length=128, null=True)), + ('name', models.CharField(blank=True, max_length=64, null=True, unique=True, verbose_name='Name')), + ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), ], options={ 'db_table': 'assetgroup', @@ -66,46 +93,93 @@ class Migration(migrations.Migration): name='IDC', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=32, verbose_name='\u673a\u623f\u540d\u79f0')), - ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='\u673a\u623f\u5e26\u5bbd')), - ('contact', models.CharField(blank=True, max_length=16, verbose_name='\u8054\u7cfb\u4eba')), - ('phone', models.CharField(blank=True, max_length=32, verbose_name='\u8054\u7cfb\u7535\u8bdd')), - ('address', models.CharField(blank=True, max_length=128, verbose_name='\u673a\u623f\u5730\u5740')), - ('network', models.TextField(blank=True, verbose_name='IP\u5730\u5740\u6bb5')), - ('date_added', models.DateField(auto_now=True, null=True)), - ('operator', models.CharField(blank=True, max_length=32, verbose_name='\u8fd0\u8425\u5546')), - ('created_by', models.CharField(blank=True, max_length=32, verbose_name='\u521b\u5efa\u8005')), - ('comment', models.CharField(blank=True, max_length=128, verbose_name='\u5907\u6ce8')), + ('name', models.CharField(max_length=32, verbose_name='Name')), + ('bandwidth', models.CharField(blank=True, max_length=32, verbose_name='Bandwidth')), + ('contact', models.CharField(blank=True, max_length=16, verbose_name='Contact')), + ('phone', models.CharField(blank=True, max_length=32, verbose_name='Phone')), + ('address', models.CharField(blank=True, max_length=128, verbose_name='Address')), + ('network', models.TextField(blank=True, verbose_name='Network')), + ('date_added', models.DateField(auto_now=True, null=True, verbose_name='Date added')), + ('operator', models.CharField(blank=True, max_length=32, verbose_name='Operator')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), ], options={ 'db_table': 'idc', - 'verbose_name': 'IDC\u673a\u623f', - 'verbose_name_plural': 'IDC\u673a\u623f', + }, + ), + migrations.CreateModel( + name='Label', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(blank=True, max_length=64, null=True, verbose_name='KEY')), + ('value', models.CharField(blank=True, max_length=64, null=True, verbose_name='VALUE')), + ('created_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('date_added', models.DateTimeField(auto_now=True, null=True)), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), + ('asset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.Asset', verbose_name='Asset')), + ], + options={ + 'db_table': 'label', + }, + ), + migrations.CreateModel( + name='SysUser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, unique=True, verbose_name='Name')), + ('username', models.CharField(blank=True, max_length=16, verbose_name='Username')), + ('password', models.CharField(blank=True, max_length=256, verbose_name='Password')), + ('protocol', models.CharField(default='ssh', max_length=16, verbose_name='Protocol')), + ('private_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH private key')), + ('public_key', models.CharField(blank=True, max_length=4096, verbose_name='SSH public key')), + ('is_default', models.BooleanField(default=True, verbose_name='As default')), + ('auto_push', models.BooleanField(default=True, verbose_name='Auto push')), + ('auto_update', models.BooleanField(default=True, verbose_name='Auto update pass/key')), + ('sudo', models.TextField(blank=True, max_length=4096, verbose_name='Sudo')), + ('shell', models.CharField(blank=True, max_length=64, verbose_name='Shell')), + ('home', models.CharField(blank=True, max_length=64, verbose_name='Home')), + ('uid', models.IntegerField(blank=True, verbose_name='Uid')), + ('date_added', models.DateTimeField(auto_now=True, null=True)), + ('create_by', models.CharField(blank=True, max_length=32, verbose_name='Created by')), + ('comment', models.CharField(blank=True, max_length=128, verbose_name='Comment')), + ], + options={ + 'db_table': 'sysuser', }, ), migrations.AddField( model_name='asset', name='env', - field=models.ManyToManyField(blank=True, related_name='asset_env_extend', to='assets.AssetExtend', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4\u73af\u5883'), + field=models.ManyToManyField(related_name='asset_env_extend', to='assets.AssetExtend', verbose_name='Asset environment'), ), migrations.AddField( model_name='asset', - name='group', - field=models.ManyToManyField(blank=True, to='assets.AssetGroup', verbose_name='\u6240\u5c5e\u4e3b\u673a\u7ec4'), + name='groups', + field=models.ManyToManyField(blank=True, null=True, to='assets.AssetGroup', verbose_name='Asset groups'), ), migrations.AddField( model_name='asset', name='idc', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.IDC', verbose_name='\u673a\u623f'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='assets.IDC', verbose_name='IDC'), ), migrations.AddField( model_name='asset', name='status', - field=models.ManyToManyField(blank=True, related_name='asset_status_extend', to='assets.AssetExtend', verbose_name='\u8d44\u4ea7\u72b6\u6001'), + field=models.ManyToManyField(related_name='asset_status_extend', to='assets.AssetExtend', verbose_name='Asset status'), + ), + migrations.AddField( + model_name='asset', + name='sys_user', + field=models.ManyToManyField(blank=True, null=True, to='assets.SysUser', verbose_name='System User'), ), migrations.AddField( model_name='asset', name='type', - field=models.ManyToManyField(blank=True, related_name='asset_type_extend', to='assets.AssetExtend', verbose_name='\u8d44\u4ea7\u7c7b\u578b'), + field=models.ManyToManyField(related_name='asset_type_extend', to='assets.AssetExtend', verbose_name='Asset type'), + ), + migrations.AlterIndexTogether( + name='asset', + index_together=set([('ip', 'port')]), ), ] diff --git a/apps/assets/migrations/0002_auto_20160821_1757.py b/apps/assets/migrations/0002_auto_20160821_1757.py deleted file mode 100644 index e22966fd8..000000000 --- a/apps/assets/migrations/0002_auto_20160821_1757.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10 on 2016-08-21 09:57 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('assets', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='asset', - name='cabinet_pos', - field=models.IntegerField(blank=True, max_length=4, verbose_name='\u673a\u5668\u4f4d\u7f6e'), - ), - ] diff --git a/apps/assets/migrations/0003_auto_20160821_1759.py b/apps/assets/migrations/0003_auto_20160821_1759.py deleted file mode 100644 index e5c49bcd5..000000000 --- a/apps/assets/migrations/0003_auto_20160821_1759.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.10 on 2016-08-21 09:59 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('assets', '0002_auto_20160821_1757'), - ] - - operations = [ - migrations.AlterField( - model_name='asset', - name='cabinet_pos', - field=models.IntegerField(blank=True, max_length=4, null=True, verbose_name='\u673a\u5668\u4f4d\u7f6e'), - ), - ] diff --git a/apps/assets/models.py b/apps/assets/models.py index f29c2a5f2..7f4a4c579 100644 --- a/apps/assets/models.py +++ b/apps/assets/models.py @@ -14,7 +14,7 @@ class AssetGroup(models.Model): return self.name class Meta: - db_table = 'assetgroup' + db_table = 'asset_group' class IDC(models.Model): diff --git a/apps/assets/templates/assets/asset_add.html b/apps/assets/templates/assets/asset_create.html similarity index 100% rename from apps/assets/templates/assets/asset_add.html rename to apps/assets/templates/assets/asset_create.html diff --git a/apps/assets/templates/assets/assetgroup_add.html b/apps/assets/templates/assets/asset_group_create.html similarity index 100% rename from apps/assets/templates/assets/assetgroup_add.html rename to apps/assets/templates/assets/asset_group_create.html diff --git a/apps/assets/templates/assets/assetgroup_list.html b/apps/assets/templates/assets/asset_group_list.html similarity index 60% rename from apps/assets/templates/assets/assetgroup_list.html rename to apps/assets/templates/assets/asset_group_list.html index bc21bc8d5..484c131f4 100644 --- a/apps/assets/templates/assets/assetgroup_list.html +++ b/apps/assets/templates/assets/asset_group_list.html @@ -2,35 +2,35 @@ {% load i18n %} {% load common_tags %} {% block content_left_head %} - {% trans "Create asset group" %} + {% trans "Create asset group" %} {% endblock %} {% block table_head %} - {% trans 'Name' %} + {% trans 'Name' %} {% trans 'Asset num' %} - {% trans 'Comment' %} + {% trans 'Comment' %} {% endblock %} {% block table_body %} - {% for assetgroup in assetgroups %} + {% for asset_group in asset_group_list %} - + - - {{ assetgroup.name }} + + {{ asset_group.name }} - {{ assetgroup.assets.count }} - {{ assetgroup.comment }} + {{ asset_group.assets.count }} + {{ asset_group.comment }} - {% trans 'Edit' %} - {% trans 'Delete' %} + {% trans 'Edit' %} + {% trans 'Delete' %} {% endfor %} @@ -55,5 +55,3 @@
    {% endblock %} - - diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 61a56a406..4895f454c 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -1,4 +1,5 @@ {% extends 'base.html' %} +{% load i18n %} {% block content %}
    @@ -23,7 +24,7 @@
    diff --git a/apps/assets/urls.py b/apps/assets/urls.py index 800381252..68279389a 100644 --- a/apps/assets/urls.py +++ b/apps/assets/urls.py @@ -14,14 +14,14 @@ app_name = 'assets' urlpatterns = [ url(r'^$', views.AssetListView.as_view(), name='asset-index'), url(r'^asset$', views.AssetListView.as_view(), name='asset-list'), - url(r'^asset/add$', views.AssetAddView.as_view(), name='asset-add'), + 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]+)$/edit', views.AssetEditView.as_view(), name='asset-edit'), + 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'^assetgroup$', views.AssetGroupListView.as_view(), name='assetgroup-list'), - url(r'^assetgroup/add$', views.AssetGroupAddView.as_view(), name='assetgroup-add'), - url(r'^assetgroup/(?P[0-9]+)$', views.AssetGroupDetailView.as_view(), name='assetgroup-detail'), - url(r'^assetgroup/(?P[0-9]+)/edit$', views.AssetGroupEditView.as_view(), name='assetgroup-edit'), - url(r'^assetgroup/(?P[0-9]+)/delete$', views.AssetGroupDeleteView.as_view(), name='assetgroup-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'^api/v1.0/', include(router.urls)), ] diff --git a/apps/assets/views.py b/apps/assets/views.py index 9f2150956..efe698f13 100644 --- a/apps/assets/views.py +++ b/apps/assets/views.py @@ -16,18 +16,18 @@ from .forms import AssetForm, AssetGroupForm from .utils import AdminUserRequiredMixin -class AssetAddView(CreateView): +class AssetCreateView(CreateView): model = Asset form_class = AssetForm - template_name = 'assets/asset_add.html' + template_name = 'assets/asset_create.html' success_url = reverse_lazy('assets:asset-list') def form_invalid(self, form): print(form.errors) - return super(AssetAddView, self).form_invalid(form) + return super(AssetCreateView, self).form_invalid(form) -class AssetEditView(UpdateView): +class AssetUpdateView(UpdateView): pass @@ -48,11 +48,11 @@ class AssetDetailView(DetailView): template_name = 'assets/asset_detail.html' -class AssetGroupAddView(CreateView): +class AssetGroupCreateView(CreateView): model = AssetGroup form_class = AssetGroupForm - template_name = 'assets/assetgroup_add.html' - success_url = reverse_lazy('assets:assetgroup-list') + template_name = 'assets/asset_group_create.html' + success_url = reverse_lazy('assets:asset-group-list') def get_context_data(self, **kwargs): context = { @@ -61,13 +61,17 @@ class AssetGroupAddView(CreateView): 'assets': Asset.objects.all(), } kwargs.update(context) - return super(AssetGroupAddView, self).get_context_data(**kwargs) + return super(AssetGroupCreateView, self).get_context_data(**kwargs) + + def form_valid(self, form): + print(form.data) + return super(AssetGroupCreateView, self).form_valid(form) class AssetGroupListView(ListView): model = AssetGroup - context_object_name = 'assetgroups' - template_name = 'assets/assetgroup_list.html' + context_object_name = 'asset_group_list' + template_name = 'assets/asset_group_list.html' def get_context_data(self, **kwargs): context = { @@ -82,11 +86,11 @@ class AssetGroupDetailView(DetailView): pass -class AssetGroupEditView(UpdateView): +class AssetGroupUpdateView(UpdateView): model = AssetGroup form_class = AssetGroupForm - template_name = 'assets/assetgroup_add.html' - success_url = reverse_lazy('assets:assetgroup-list') + template_name = 'assets/asset_group_create.html' + success_url = reverse_lazy('assets:asset-group-list') def get_context_data(self, **kwargs): context = { @@ -95,7 +99,7 @@ class AssetGroupEditView(UpdateView): 'assets': Asset.objects.all(), } kwargs.update(context) - return super(AssetGroupEditView, self).get_context_data(**kwargs) + return super(AssetGroupUpdateView, self).get_context_data(**kwargs) class AssetGroupDeleteView(DeleteView): diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 2c3169361..1ad37fead 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -10,7 +10,7 @@
  • @@ -19,7 +19,7 @@