diff --git a/passManager/admin.py b/passManager/admin.py index 0d02567..9c28f5c 100644 --- a/passManager/admin.py +++ b/passManager/admin.py @@ -3,7 +3,8 @@ from django.forms import TextInput, Textarea from django.contrib.admin import SimpleListFilter -from passManager.models import passDb +from passManager.models import passDb, SignedCharField +from django import forms class LoginsFilter(SimpleListFilter): @@ -54,43 +55,94 @@ class ServersFilter(SimpleListFilter): Make facet of server names number with 3 or more name ocurrences """ + # print self.request title = 'TOP Servers' parameter_name = 'servers' - # Get all objects - rows = passDb.objects.all() - # Server list - servers = [] - for row in rows: - servers.append(row.server) - # Duplicate clean - # servers = set(servers) - # Get tuple with servers and ocurences - lista = {} - for l in set(servers): - numrows = passDb.objects.filter(server=l).count() - if numrows >= 1: - lista[str(l)] = numrows + slist = [] + + def lookups(self, request, model_admin): - # Import module for order dictionary - from operator import itemgetter - slist = sorted(lista.items(), key=itemgetter(1), reverse=True) + if request.user.is_superuser: - # Generate facets - facet = [] - for n in range(0 ,(len(slist))): - facet.append(((slist[n][0]),(slist[n][0]+' ('+str(slist[n][1]))+')')) + # Get all objects + rows = passDb.objects.all() + else: + rows = passDb.objects.filter(uploader = request.user) - def lookups(self, request, model_admin): - return (self.facet) + # Server list + servers = [] + for row in rows: + servers.append(row.server) + # Duplicate clean + # servers = set(servers) + + # Get tuple with servers and ocurences + lista = {} + for l in set(servers): + numrows = passDb.objects.filter(server=l).count() + if numrows >= 1: + lista[str(l)] = numrows + + + + # Import module for order dictionary + from operator import itemgetter + slist = sorted(lista.items(), key=itemgetter(1), reverse=True) + + self.slist = slist + + # Generate facets + facet = [] + for n in range(0 ,(len(slist))): + facet.append(((slist[n][0]),(slist[n][0]+' ('+str(slist[n][1]))+')')) + + + + return (facet) def queryset(self, request, queryset): + for n in range(0 ,(len(self.slist))): val = self.slist[n][0] if self.value() == val: return queryset.filter(server=val) +class UploaderFilter(SimpleListFilter): + """ Filter based on uploader. """ + + title = 'Uploader' + parameter_name = 'uploader' + + + def lookups(self, request, model_admin): + + facet = [] + if request.user.is_superuser: + rows = passDb.objects.values('uploader__id','uploader__username').distinct() + for row in rows: + facet.append((row['uploader__id'],row['uploader__username'])) + + return (facet) + + def queryset(self, request, queryset): + + if self.value() is None: + return queryset.all() + else: + return queryset.filter(uploader__id = self.value()) + + +class PassManagerForm(forms.ModelForm): + model = passDb + class Meta: + + widgets = { 'password': forms.TextInput(attrs={'id': 'field_password'}), } + + + class PassManagerAdmin(admin.ModelAdmin): + form = PassManagerForm class Media: js = ("jquery-1.7.1.min.js", "jquery-ui-1.8.18.custom.min.js", "functions.js",) css = { @@ -99,7 +151,6 @@ class Media: formfield_overrides = { models.CharField: {'widget': TextInput(attrs={'size':'40'})}, - #models.TextField: {'widget': Textarea(attrs={'rows':10, 'cols':60})}, } ordering = ['creation_date'] @@ -118,13 +169,33 @@ class Media: "uploader" ] - list_filter = (LoginsFilter, ServersFilter, 'uploader','creation_date') + list_filter = (LoginsFilter, ServersFilter, UploaderFilter,'creation_date') + + fieldsets = [ (None, {'fields': ['name',('login','password'),'server','notes']}), ] search_fields = ['name','login','server','notes'] - + + def queryset(self, request): + qs = super(PassManagerAdmin, self).queryset(request) + if request.user.is_superuser: + return qs + else: + return qs.filter(uploader = request.user) + + + def has_change_permission(self, request, obj=None): + if not obj: + return True # So they can see the change list page + if request.user.is_superuser or obj.uploader == request.user: + return True + else: + return False + + has_delete_permission = has_change_permission + def save_model(self, request, obj, form, change): #obj.password = passEncr('encrypt', obj.password) obj.uploader = request.user diff --git a/passManager/static/functions.js b/passManager/static/functions.js index fdcb904..737596b 100644 --- a/passManager/static/functions.js +++ b/passManager/static/functions.js @@ -14,7 +14,8 @@ $(function() { }); (function($) { - $(document).ready(function(){ + $(document).ready(function(){ + var windowWidth = 760 var windowHeight = 430 var centerWidth = (window.screen.width - windowWidth) / 2; @@ -32,6 +33,11 @@ $(function() { event.preventDefault(); }); + + $( "#field_password" ).after( '' ); + $('#generate').click(loadGeneratedPassword); + + }); })(django.jQuery); @@ -41,4 +47,30 @@ function cambiar(id, texto) { document.getElementById(id).innerHTML = texto.replace(/\&/g, "&").replace(//g, ">"); document.getElementById(id).style.color = "black"; } +} + +function loadGeneratedPassword() { + var length = 8; + $('#field_password').val(password(length,true)); +} + +function password(length, special) { + var iteration = 0; + var password = ""; + var randomNumber; + if(special == undefined){ + var special = false; + } + while(iteration < length){ + randomNumber = (Math.floor((Math.random() * 100)) % 94) + 33; + if(!special){ + if ((randomNumber >=33) && (randomNumber <=47)) { continue; } + if ((randomNumber >=58) && (randomNumber <=64)) { continue; } + if ((randomNumber >=91) && (randomNumber <=96)) { continue; } + if ((randomNumber >=123) && (randomNumber <=126)) { continue; } + } + iteration++; + password += String.fromCharCode(randomNumber); + } + return password; } \ No newline at end of file diff --git a/passManager/static/reload-16.png b/passManager/static/reload-16.png new file mode 100644 index 0000000..f2e3bd7 Binary files /dev/null and b/passManager/static/reload-16.png differ