From c491c6f8dcabc3101192177ad81186e2e76cf7be Mon Sep 17 00:00:00 2001 From: Leonidas Poulopoulos Date: Thu, 31 Jan 2013 15:33:56 +0200 Subject: [PATCH] Added alternate view for Helpdesk Added view for Helpdesk with an "overview" perms attribute. This closes #2063, closes #2046, closes #1898. --- README.txt | 4 + accounts/migrations/0001_initial.py | 91 ++++++++++ accounts/migrations/0002_add_overview.py | 89 ++++++++++ accounts/models.py | 6 + flowspec/views.py | 23 ++- locale/el/LC_MESSAGES/django.mo | Bin 14733 -> 15082 bytes locale/el/LC_MESSAGES/django.po | 171 ++++++++++++------- templates/base.html | 6 + templates/footer.html | 7 +- templates/overview/index.html | 264 ++++++++++++++++++++++++++++++ templates/overview/login.html | 54 ++++++ templates/welcome.html | 11 +- urls.py.dist | 4 + 13 files changed, 664 insertions(+), 66 deletions(-) create mode 100644 accounts/migrations/0001_initial.py create mode 100644 accounts/migrations/0002_add_overview.py create mode 100644 accounts/migrations/__init__.py create mode 100644 templates/overview/index.html create mode 100644 templates/overview/login.html diff --git a/README.txt b/README.txt index 9ac2197..8cec0e0 100644 --- a/README.txt +++ b/README.txt @@ -100,3 +100,7 @@ Under the templates folder (templates), you can alter the footer.html file to in * Modify flatpages to suit your needs * Once Apache proxying and shibboleth modules are properly setup, login to the tool. If shibboleth SP is properly setup you should see a user pending activation message and an activation email should arrive at the NOTIFY_ADMIN_MAILS accounts. +5. UPDATING: +* from 0.9.1 to 0.9.2: + - Check diff between urls + - run ./manage.py migrate accounts (data migration for perms) diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..b67885b --- /dev/null +++ b/accounts/migrations/0001_initial.py @@ -0,0 +1,91 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'UserProfile' + db.create_table('accounts_userprofile', ( + ('peer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), + )) + db.send_create_signal('accounts', ['UserProfile']) + + + def backwards(self, orm): + + # Deleting model 'UserProfile' + db.delete_table('accounts_userprofile') + + + models = { + 'accounts.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'peers.peer': { + 'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {}), + 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['accounts'] diff --git a/accounts/migrations/0002_add_overview.py b/accounts/migrations/0002_add_overview.py new file mode 100644 index 0000000..6d43127 --- /dev/null +++ b/accounts/migrations/0002_add_overview.py @@ -0,0 +1,89 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + ct, created = orm['contenttypes.ContentType'].objects.get_or_create( + model='userprofile', app_label='accounts') # model must be lowercase! + perm, created = orm['auth.permission'].objects.get_or_create( + content_type=ct, codename='overview', defaults=dict(name=u'Can see registered users and rules')) + + def backwards(self, orm): + "Write your backwards methods here." + ct, created = orm['contenttypes.ContentType'].objects.get_or_create( + model='userprofile', app_label='accounts') # model must be lowercase! + perm, created = orm['auth.permission'].objects.get_or_create( + content_type=ct, codename='overview') + perm.delete() + + models = { + 'accounts.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'peers.peer': { + 'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {}), + 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['accounts'] diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/models.py b/accounts/models.py index cb3fb47..5ecce5c 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -7,6 +7,12 @@ class UserProfile(models.Model): user = models.OneToOneField(User) peer = models.ForeignKey(Peer) + class Meta: + permissions = ( + ("overview", "Can see registered users and rules"), + ) + + def __unicode__(self): return "%s:%s" %(self.user.username, self.peer.peer_name) diff --git a/flowspec/views.py b/flowspec/views.py index ad8111d..0f14b6e 100644 --- a/flowspec/views.py +++ b/flowspec/views.py @@ -436,6 +436,22 @@ def selectinst(request): form.fields['institution'] = forms.ModelChoiceField(queryset=Peer.objects.all(), empty_label=None) return render_to_response('registration/select_institution.html', {'form': form}, context_instance=RequestContext(request)) +@never_cache +def overview(request): + user = request.user + if user.is_authenticated(): + if user.has_perm('accounts.overview'): + users = User.objects.all() + group_routes = Route.objects.all() + return render_to_response('overview/index.html', {'users': users, 'routes': group_routes}, + context_instance=RequestContext(request)) + else: + violation=True + return render_to_response('overview/index.html', {'violation': violation}, + context_instance=RequestContext(request)) + else: + return HttpResponseRedirect(reverse("altlogin")) + @login_required @never_cache def user_logout(request): @@ -471,6 +487,7 @@ def send_new_mail(subject, message, from_email, recipient_list, bcc_list): def lookupShibAttr(attrmap, requestMeta): for attr in attrmap: - if (attr in requestMeta) & (len(requestMeta[attr]) > 0): - return requestMeta[attr] - return '' \ No newline at end of file + if (attr in requestMeta.keys()): + if len(requestMeta[attr]) > 0: + return requestMeta[attr] + return '' diff --git a/locale/el/LC_MESSAGES/django.mo b/locale/el/LC_MESSAGES/django.mo index c99c9ba8392461dd226ad6cdca96af387863f7a2..aa57ba519b837f3e9da936925ecfd7e3c8aabfda 100644 GIT binary patch delta 3161 zcmZwJdra0<9LMnkg31Gk!XwBfeJnH;MG!+lNmDFER4~N6m12(w-VoxZ=!1${p({u9 zkELC$%@UQIWYb)&wA`L2n_CyPTatxDQJg}#lemodXJ79YULs5dLc-nbs?a0jY^PIE`!7>-95mg+kFn@TFlxDIvWUgw6lbpyu-u@F0)>n=v4`+B1~jzwiG5wmar zHsd_Z#a~eO4P#yw;7HU9Hly!;Ds5EyMNb& zdQ>KTs5fjzJ^wQ5`MszNyyct^M3aAA_?8oW@gg>1Cstq``7gvPsD{R|0GL*ji#jeu zX2Z-!wNr*#ORJsh&*FU??{bdYPy_2gz3``Q@~?(|;)F(i4b{O-B-dnWXrX~lqMy4Rk$jn2sZAvi_>u@^0gc|52R6jRRnY-nqqK1NF?G9X+z;PTh3uY9m zppMwh0F~3I1}>vg zb{&&3oP3sG8cxL)oQoGw4UT5Cyo1R`9T#AIkTJzLgX6ClJ+o>0^Kqd`la7Nh4@c6! zsi2}adCk#}O5ttPDve|`N?AIpfgF4gi;)J*Mtl_ypr$OJiB+l>qS{%3umkfk zjJI}a{})pk&xs{?1oz;6Eb%ZQait6Ed85*sVF6}iu(_%k{73jN3C7R0e zhwKN|qegrXlY{v#U@wlZkFf`G80V=-S|AlWZUiS zK{Dwx?>i^XBU5NtOICT9-y}i{ZWXbTPbxluKA^X-kP=>mSz6JX7 zX^X0V!hIYb?y1=UrwYgDw@Hd{4g9>so6Jq%|OnroG% zL$UyZ;Dkd>f31C?on3#l$jV5;2`%VH?(zwN1fV?Mtwb(1M#tG!R9E3R~Rz zOSuO58)WSYH*O$QB8e&bf9M%1PZ3(ZDx5Mba;ua(c6XeG)r6PmMhqsF6YGgN#1>*B zp&c@<{kSV4ENNDax3Z?pTWh*1p8PeXWvfkr*IU_gI_AsJ+0`q(Rqean72RUyRCz0_ zjP>go;ju0p?zbx_v|8s|UW}jHGb7EDHYz(KtNliNrh8&*pwa(fV2l4)Uk!p7IXW1J;8_ Z0-KHhof(Y?sAfN;m3L4KT_<#{o28!Sl@?dy37ujk;K;~@F zAGO&Qglh6lq zQNPc}5G+AItVFJNn0h*kIPn~|Vn6D_Tc{h}L0vF|Q82eP z@qWQXT+7`wkrvdryD?mkeSi*Qnq!!OL%0+#p`PqE&c`|IMc**@00Y)RBx&XZ2I8o7 z+%VHhdn}EoW>M!3T7n#W`%l`ZQyj@Dgg~v20qc{W8=I3#{d+?;9`xThUb; z)w?Y6QmwZQ;xfM`%xKt%{qa)@j28)ucNMC=*V?Xpcc<@Vi2`I^H;j7`84k1 z_y^R0<;+$S-o}R}I*iHQywg#cxR%el;$8H`v{k&;F%v7X4`0DAu?HPh1og`kdHg{EEMY4x5Cw*IH@>F%+e7(DDbY3#{11V0%dpvKHW&q>r4Z6r3?b4yXXLoJt3-NX~C2v6&vqe9IPH6jWwC7(yZz7LKBHD-r&UL{dfn%LfSDnStT|Um~ t*f+e!8sZuPa`TdM3W{>Gol|l7QO?4wdtS~JIamD0atorJ*#(o{{{sFw0aXA1 diff --git a/locale/el/LC_MESSAGES/django.po b/locale/el/LC_MESSAGES/django.po index d3c555b..dc30937 100644 --- a/locale/el/LC_MESSAGES/django.po +++ b/locale/el/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-01-25 18:20+0200\n" +"POT-Creation-Date: 2013-01-30 02:39+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Leonidas Poulopoulos \n" "Language-Team: LANGUAGE \n" @@ -123,8 +123,9 @@ msgstr "" msgid "Port should be an integer" msgstr "Η port θα πρέπει να είναι ένας ακέραιος αριθμός" -#: flowspec/models.py:107 templates/apply.html:201 -#: templates/user_routes.html:250 +#: flowspec/models.py:107 templates/apply.html:207 +#: templates/user_routes.html:250 templates/overview/index.html:158 +#: templates/overview/index.html.py:183 msgid "Name" msgstr "Όνομα" @@ -132,50 +133,52 @@ msgstr "Όνομα" msgid "Network address. Use address/CIDR notation" msgstr "Διεύθυνση δικτύου/υποδικτύου. Χρησιμοποιήστε σύνταξη διεύθυνσης/CIDR" -#: flowspec/models.py:109 templates/apply.html:237 +#: flowspec/models.py:109 templates/apply.html:243 msgid "Source Address" msgstr "Διεύθυνση Πηγής" -#: flowspec/models.py:110 templates/apply.html:287 +#: flowspec/models.py:110 templates/apply.html:293 msgid "Source Port" msgstr "Port Πηγής" -#: flowspec/models.py:111 templates/apply.html:250 +#: flowspec/models.py:111 templates/apply.html:256 msgid "Destination Address" msgstr "Διεύθυνση Προορισμού" -#: flowspec/models.py:112 templates/apply.html:302 +#: flowspec/models.py:112 templates/apply.html:308 msgid "Destination Port" msgstr "Port Προορισμού" -#: flowspec/models.py:113 templates/apply.html:292 templates/apply.html.py:307 -#: templates/apply.html:317 templates/apply.html.py:322 +#: flowspec/models.py:113 templates/apply.html:298 templates/apply.html.py:313 +#: templates/apply.html:323 templates/apply.html.py:328 msgid "Port" msgstr "" -#: flowspec/models.py:119 templates/apply.html:263 +#: flowspec/models.py:119 templates/apply.html:269 msgid "Protocol" msgstr "Πρωτόκολλο" -#: flowspec/models.py:121 templates/apply.html:345 -#: templates/user_routes.html:252 +#: flowspec/models.py:121 templates/apply.html:351 +#: templates/user_routes.html:252 templates/overview/index.html:185 msgid "Then" msgstr "Ενέργειες" #: flowspec/models.py:124 templates/user_routes.html:253 +#: templates/overview/index.html:159 templates/overview/index.html.py:186 msgid "Status" msgstr "Κατάσταση" -#: flowspec/models.py:127 templates/apply.html:366 -#: templates/user_routes.html:256 +#: flowspec/models.py:127 templates/apply.html:372 +#: templates/user_routes.html:256 templates/overview/index.html:189 msgid "Expires" msgstr "Λήγει" #: flowspec/models.py:128 templates/user_routes.html:257 +#: templates/overview/index.html:190 msgid "Response" msgstr "Απόκριση Δικτύου" -#: flowspec/models.py:129 templates/apply.html:382 +#: flowspec/models.py:129 templates/apply.html:388 msgid "Comments" msgstr "Σχόλια" @@ -281,7 +284,7 @@ msgstr "Επεξεργασία φίλτρου" msgid "Create new Rule" msgstr "Δημιουργία νέου Φίλτρου" -#: templates/apply.html:15 templates/apply.html.py:182 +#: templates/apply.html:15 templates/apply.html.py:188 msgid "Edit rule" msgstr "Επεξεργασία φίλτρου" @@ -289,93 +292,94 @@ msgstr "Επεξεργασία φίλτρου" msgid "Create rule" msgstr "Δημιουργία φίλτρου" -#: templates/apply.html:35 templates/apply.html.py:67 +#: templates/apply.html:41 templates/apply.html.py:73 msgid "Add" msgstr "Προσθήκη" -#: templates/apply.html:55 templates/apply.html.py:95 +#: templates/apply.html:61 templates/apply.html.py:101 #: templates/user_routes.html:34 msgid "Cancel" msgstr "Άκυρο" -#: templates/apply.html:183 +#: templates/apply.html:189 msgid "Apply for a new rule" msgstr "Αίτηση δημιουργίας νέου φίλτρου" -#: templates/apply.html:198 +#: templates/apply.html:204 msgid "Rule Basic Info" msgstr "Βασικές Πληροφορίες Φίλτρου" -#: templates/apply.html:216 +#: templates/apply.html:222 msgid "Admin Options" msgstr "Επιλογές Διαχείρισης" -#: templates/apply.html:219 templates/user_routes.html:255 +#: templates/apply.html:225 templates/user_routes.html:255 +#: templates/overview/index.html:188 msgid "Applier" msgstr "Χρήστης" -#: templates/apply.html:234 +#: templates/apply.html:240 msgid "Rule Match Conditions" msgstr "Όροι ταύτισης φίλτρου" -#: templates/apply.html:275 +#: templates/apply.html:281 msgid "Ports" msgstr "" -#: templates/apply.html:281 +#: templates/apply.html:287 msgid "Advanced Settings (Ports)" msgstr "Προηγμένες Ρυθμίσεις (Ports)" -#: templates/apply.html:285 +#: templates/apply.html:291 msgid "" "Select source/destination port(s), or select common port(s) for both source/" "destination" msgstr "" -#: templates/apply.html:342 +#: templates/apply.html:348 msgid "Rule Actions" msgstr "Ενέργειες Φίλτρου" -#: templates/apply.html:363 +#: templates/apply.html:369 msgid "Expiration" msgstr "Λήξη" -#: templates/apply.html:379 +#: templates/apply.html:385 msgid "Use/Comments" msgstr "Χρήση/Σχόλια" -#: templates/apply.html:384 +#: templates/apply.html:390 msgid "" "Give a short description of the intended use of this rule, that justifies " "the parameter selection above. Feel free to include any additional comments." msgstr "" -#: templates/apply.html:398 templates/registration/select_institution.html:37 +#: templates/apply.html:404 templates/registration/select_institution.html:37 msgid "Apply" msgstr "Εφαρμογή" -#: templates/apply.html:407 +#: templates/apply.html:413 msgid "Add new port" msgstr "Νέα port" -#: templates/base.html:59 templates/base.html.py:158 +#: templates/base.html:59 templates/base.html.py:164 msgid "Welcome" msgstr "Καλωσήρθατε" -#: templates/base.html:73 templates/base.html.py:102 templates/profile.html:4 +#: templates/base.html:73 templates/base.html.py:103 templates/profile.html:4 #: templates/profile.html.py:5 templates/profile.html:7 msgid "My profile" msgstr "Το προφίλ μου" -#: templates/base.html:75 templates/base.html.py:106 +#: templates/base.html:75 templates/base.html.py:112 msgid "Admin" msgstr "Διαχειριστής" -#: templates/base.html:77 templates/base.html.py:136 +#: templates/base.html:77 templates/base.html.py:142 msgid "Logout" msgstr "Έξοδος" -#: templates/base.html:80 templates/base.html.py:144 +#: templates/base.html:80 templates/base.html.py:150 msgid "" "After clicking Retry Login, it is strongly suggested to close your browser " "and visit the page again" @@ -383,20 +387,24 @@ msgstr "" "Αφού επιλέξετε Επανάληψη Εισόδου κλείστε τον browser σας και επισκεφθείτε " "ξανά τη σελίδα" -#: templates/base.html:80 templates/base.html.py:144 +#: templates/base.html:80 templates/base.html.py:150 msgid "Retry Login" msgstr "Επανάληψη Εισόδου" -#: templates/base.html:82 templates/base.html.py:141 templates/base.html:147 +#: templates/base.html:82 templates/base.html.py:147 templates/base.html:153 #: templates/welcome.html:21 msgid "Shibboleth Login" msgstr "Είσοδος με Shibboleth" -#: templates/base.html:115 +#: templates/base.html:108 templates/overview/index.html:121 +msgid "Overview" +msgstr "Επισκόπηση" + +#: templates/base.html:121 msgid "Language" msgstr "Γλώσσα" -#: templates/base.html:158 templates/user_routes.html:214 +#: templates/base.html:164 templates/user_routes.html:214 #: templates/user_routes.html.py:220 msgid "My rules" msgstr "Τα φίλτρα μου" @@ -448,7 +456,7 @@ msgstr "Πληροφορίες" msgid "Service Terms" msgstr "Όροι Χρήσης" -#: templates/profile.html:11 +#: templates/profile.html:11 templates/overview/index.html:156 msgid "Username" msgstr "" @@ -460,7 +468,7 @@ msgstr "Όνομα" msgid "Last name" msgstr "Επώνυμο" -#: templates/profile.html:23 +#: templates/profile.html:23 templates/overview/index.html:157 msgid "Email" msgstr "" @@ -486,43 +494,52 @@ msgstr "" msgid "Suspend" msgstr "Κατάργηση" -#: templates/user_routes.html:124 +#: templates/user_routes.html:124 templates/overview/index.html:43 +#: templates/overview/index.html.py:97 msgid "Display" msgstr "Προβολή" -#: templates/user_routes.html:124 +#: templates/user_routes.html:124 templates/overview/index.html:43 +#: templates/overview/index.html.py:97 msgid "All" msgstr "όλων των" -#: templates/user_routes.html:124 +#: templates/user_routes.html:124 templates/overview/index.html:97 msgid "rules" msgstr "φίλτρων" -#: templates/user_routes.html:126 +#: templates/user_routes.html:126 templates/overview/index.html:45 +#: templates/overview/index.html.py:99 msgid "No records to display" msgstr "Δεν βρέθηκαν εγγραφές" -#: templates/user_routes.html:128 +#: templates/user_routes.html:128 templates/overview/index.html:47 +#: templates/overview/index.html.py:101 msgid "Showing 0 to 0 of 0 entries" msgstr "Δείχνοντας 0 εως 0 από 0 εγγραφές" -#: templates/user_routes.html:131 +#: templates/user_routes.html:131 templates/overview/index.html:50 +#: templates/overview/index.html.py:104 msgid "Search:" msgstr "Αναζήτηση:" -#: templates/user_routes.html:134 +#: templates/user_routes.html:134 templates/overview/index.html:53 +#: templates/overview/index.html.py:107 msgid "First" msgstr "Πρώτη" -#: templates/user_routes.html:135 +#: templates/user_routes.html:135 templates/overview/index.html:54 +#: templates/overview/index.html.py:108 msgid "Previous" msgstr "Προηγούμενη" -#: templates/user_routes.html:136 +#: templates/user_routes.html:136 templates/overview/index.html:55 +#: templates/overview/index.html.py:109 msgid "Next" msgstr "Επόμενη" -#: templates/user_routes.html:137 +#: templates/user_routes.html:137 templates/overview/index.html:56 +#: templates/overview/index.html.py:110 msgid "Last" msgstr "Τελευταία" @@ -534,11 +551,11 @@ msgstr "Κονσόλα" msgid "Add Rule" msgstr "Δημιουργία φίλτρου" -#: templates/user_routes.html:251 +#: templates/user_routes.html:251 templates/overview/index.html:184 msgid "Match" msgstr "Όροι" -#: templates/user_routes.html:254 +#: templates/user_routes.html:254 templates/overview/index.html:187 msgid "Details" msgstr "Λεπτομέρειες" @@ -547,22 +564,24 @@ msgid "Actions" msgstr "Ενέργειες" #: templates/user_routes.html:295 templates/user_routes.html.py:309 +#: templates/overview/index.html:226 templates/overview/index.html.py:240 msgid "Suspended by user" msgstr "Απενεργοποιήθηκε από το χρήστη" #: templates/user_routes.html:298 templates/user_routes.html.py:309 +#: templates/overview/index.html:229 templates/overview/index.html.py:240 msgid "Suspended by administrator" msgstr "Απενεργοποιήθηκε από το διαχειριστή" -#: templates/user_routes.html:301 +#: templates/user_routes.html:301 templates/overview/index.html:232 msgid "Suspended due to expiration" msgstr "Απενεργοποιήθηκε λόγω λήξης" -#: templates/user_routes.html:304 +#: templates/user_routes.html:304 templates/overview/index.html:235 msgid "Syncronization error. Configuration in device deffers from rule" msgstr "Σφάλμα συγχρονισμού. Διαφορά διαμόρφωσης από συσκευή" -#: templates/user_routes.html:309 +#: templates/user_routes.html:309 templates/overview/index.html:240 msgid "Rule expired" msgstr "Λήξη Φίλτρου" @@ -648,6 +667,42 @@ msgstr "" "Για αντιμετώπιση σφαλμάτων και πληροφορίες, επικοινωνήστε με το Helpdesk του " "ΕΔΕΤ" +#: templates/overview/index.html:43 +msgid "users" +msgstr "χρήστες" + +#: templates/overview/index.html:140 +msgid "Users - Rules" +msgstr "Χρήστες - Φίλτρα" + +#: templates/overview/index.html:145 +msgid "Users" +msgstr "Χρήστες" + +#: templates/overview/index.html:146 +msgid "Rules" +msgstr "Φίλτρα" + +#: templates/overview/index.html:160 +msgid "Peer" +msgstr "Φορέας" + +#: templates/overview/index.html:169 +msgid "Active" +msgstr "" + +#: templates/overview/index.html:169 +msgid "Inactive" +msgstr "" + +#: templates/overview/index.html:169 +msgid "Key Expired" +msgstr "" + +#: templates/overview/login.html:3 templates/overview/login.html.py:14 +msgid "Overview Login" +msgstr "Εισόδος στην Επισκόπηση" + #: templates/registration/activate.html:3 #: templates/registration/activation_complete.html:3 #: templates/registration/activation_complete.html:7 diff --git a/templates/base.html b/templates/base.html index bb0f83a..a70104e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -98,9 +98,15 @@ body {