usuarios permisos grupos gestion python permissions django-1.6

python - grupos - Ver permisos en Django



gestion de usuarios django (2)

Agregar el permiso ''ver'' a la lista predeterminada de permisos

Su solución funciona, pero realmente debería evitar editar el código fuente si es posible. Hay algunas maneras de lograr esto dentro del marco:

1. Agregue el permiso durante post_syncdb() :

En un archivo en your_app / management /

from django.db.models.signals import post_syncdb from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission def add_view_permissions(sender, **kwargs): """ This syncdb hooks takes care of adding a view permission too all our content types. """ # for each of our content types for content_type in ContentType.objects.all(): # build our permission slug codename = "view_%s" % content_type.model # if it doesn''t exist.. if not Permission.objects.filter(content_type=content_type, codename=codename): # add it Permission.objects.create(content_type=content_type, codename=codename, name="Can view %s" % content_type.name) print "Added view permission for %s" % content_type.name # check for all our view permissions after a syncdb post_syncdb.connect(add_view_permissions)

Siempre que ejecute un comando ''syncdb'', se pueden verificar todos los tipos de contenido para ver si tienen un permiso ''ver'', y si no, crear uno.

2. Agregue el permiso a la opción de permisos Meta :

Debajo de cada modelo, agregarías algo como esto a sus opciones Meta :

class Pizza(models.Model): cheesiness = models.IntegerField() class Meta: permissions = ( (''view_pizza'', ''Can view pizza''), )

Esto logrará lo mismo que 1, excepto que tiene que agregarlo manualmente a cada clase.

3. NUEVO en Django 1.7 , agregue el permiso a la opción Meta default_permissions :

En Django 1.7 agregaron la opción meta default_permissions. Debajo de cada modelo, debería agregar ''vista'' a la opción default_permissions:

class Pizza(models.Model): cheesiness = models.IntegerField() class Meta: default_permissions = (''add'', ''change'', ''delete'', ''view'')

Esta pregunta ya tiene una respuesta aquí:

Como django admin tiene tres permisos en su auth: ¡agregar, cambiar, eliminar! Quiero agregar permisos de vista en esta autenticación en el panel de administración. Sé que tengo que personalizar los permisos para agregar permisos de vista en ''auth | permission | can view permission'' para ver todas las entradas.

LA MANERA:

[X] 1. Se agregó ''ver'' a la lista de permisos predeterminada

#./contrib/auth/management/init.py def _get_all_permissions(opts): "Returns (codename, name) for all permissions in the given opts." perms = [] for action in (''add'', ''change'', ''delete'', ''view''): perms.append((_get_permission_codename(action, opts), u''Can %s %s'' % (action, opts.verbose_name_raw))) return perms + list(opts.permissions)

[X] 2. Probar el permiso ''ver'' se agrega a todos los modelos

run manage.py syncdb

Confirmé que el permiso de vista ahora se agrega para todas las tablas en la tabla auth_permissions

[X] 3. Agregue "get_view_permission" a la clase de modelo predeterminada.

Se agregó get_view_permission a la clase de modelo. Puede encontrar esto en el archivo ./db/models/options.py Esto es utilizado por la clase de administrador en el siguiente paso.

def get_view_permission(self): return ''view_%s'' % self.object_name.lower()

[X] 4. Agrega "has_view_permission" a la clase de administrador predeterminada

Para ser consistente, voy a agregar "has_view_permission" al sistema. Parece que debería estar en algún lugar en contrib / admin / options.py . Se aseguró de que si el usuario tiene permiso de cambio, los permisos de vista se impliquen automáticamente.

# /contrib/admin/options.py # Added has_view_permissions def has_view_permission(self, request, obj=None): """ Returns True if the given request has permission to change or view the given Django model instance. If obj is None, this should return True if the given request has permission to change *any* object of the given type. """ opts = self.opts return self.has_change_permission(request, obj) or / request.user.has_perm(opts.app_label + ''.'' + opts.get_view_permission()) # modified get_model_perms to include ''view'' too. # No idea where this may be used, but trying to stay consistent def get_model_perms(self, request): """ Returns a dict of all perms for this model. This dict has the keys add, change, and delete and view mapping to the True/False for each of those actions. """ return { ''add'': self.has_add_permission(request), ''change'': self.has_change_permission(request), ''delete'': self.has_delete_permission(request), ''view'': self.has_view_permission(request), } # modified response_add function to return the user to the mode list # if they added a unit and have view rights ... else: self.message_user(request, msg) # Figure out where to redirect. If the user has change permission, # redirect to the change-list page for this object. Otherwise, # redirect to the admin index. #if self.has_change_permission(request, None): if self.has_change_permission(request, None) or self.has_view_permission(request, None): post_url = ''../'' else: post_url = ''../../../'' return HttpResponseRedirect(post_url) # modified the change_view function so it becomes the details # for users with view permission #if not self.has_change_permission(request, obj): if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)): raise PermissionDenied # modified the changelist_view function so it shows the list of items # if you have view permissions def changelist_view(self, request, extra_context=None): "The ''change list'' admin view for this model." from django.contrib.admin.views.main import ChangeList, ERROR_FLAG opts = self.model._meta app_label = opts.app_label #if not self.has_change_permission(request, None): if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)): raise PermissionDenied

[X] 5. Actualizar la plantilla predeterminada para mostrar modelos si el usuario tiene permiso de visualización

Modifiqué la plantilla predeterminada en contrib / admin / templates / admin / index.html. Esto también podría manejarse copiando el archivo en el directorio de plantillas locales. Hice cambios en ambos, así que tengo una copia si una actualización posterior sobrescribe mis cambios.

{% for model in app.models %} <tr> {% if model.perms.change %} <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th> {% else %} {% if model.perms.view %} <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th> {% else %} <th scope="row">{{ model.name }}</th> {% endif %} {% endif %}

[X] 6. Confirmar que el usuario puede "ver" pero no "cambiar" el modelo

Encontrado contrib / admin / templatetags / admin_modify.py parece controlar los botones guardar / guardar y continuar apareciendo o no. Se modificó el campo "guardar" del valor predeterminado de siempre verdadero, para verificar el contexto y los permisos. El usuario debería poder guardar si tienen cambios o agrega permisos.

''show_save'': (change and context[''has_change_permission'']) or (context[''add''] and context[''has_add_permission''])

[X] 7. Quite el botón "Guardar y agregar otro" si el usuario está viendo un elemento

Modificado contrib / admin / templatetags / admin_modify.py nuevamente. No sé lo que significa ''save_as'', entonces quizás rompí algo, pero parece que funciona.

#''show_save_and_add_another'': context[''has_add_permission''] and # not is_popup and (not save_as or context[''add'']) , ''show_save_and_add_another'': not is_popup and (( change and context[''has_change_permission'']) or (context[''add''] and context[''has_add_permission''])) and (not save_as or context[''add'']),

[X] 8. Modifica el permiso de "vista" para que el formulario solo sea de lectura

Si el usuario tiene el permiso "ver" y el permiso "cambiar", entonces no haga nada. Cambiar la vista de anulaciones

Si el usuario tiene el permiso "ver" sin "cambiar", entonces cambie los formularios predeterminados y agregue los atributos DISABLED o READONLY a los elementos del formulario. No todos los navegadores admiten esto, pero para mis propósitos puedo exigir que los usuarios usen el correcto. [Disabled / Readonly example] [1]

Se descubrió que no todos los navegadores reconocen "solo lectura", por lo que establece algunos controles de solo lectura y otros desactivados. Esto permite a los usuarios copiar datos de los controles de texto si es necesario.

#/django/contrib/admin/templates/admin/change_form.html {# JavaScript for prepopulated fields #} {% prepopulated_fields_js %} </div> </form></div> {% if has_view_permission and not has_change_permission %} <script type="text/javascript"> jQuery(''input:text'').attr(''readonly'', ''readonly''); jQuery(''textarea'').attr(''readonly'', ''readonly''); jQuery(''input:checkbox'').attr(''disabled'', true); jQuery(''select'').attr(''disabled'', true); jQuery(''.add-another'').hide(); </script> {% endif %}

RESPONDER FUENTE: ¿Cómo puedo MODIFICAR django para crear el permiso "ver"?

Pregunta: Después de seguir la respuesta anterior, he hecho y puedo ver esta página 127.0.0.1:8000/en-us/admin/ como de solo lectura ** pero los usuarios en usuarios no están visibles 127.0.0.1:8000/en-us/ admin / usuario . ¡Necesitas ayuda!**


Esta es una solución de trabajo probada en Django 1.6.2

[X] 1. Added ''view'' to default permission list : OK
[X] 2. Test the ''view'' permission is added to all models : OK

[X] 3. Add "get_view_permission" to default model class. es inútil más:

def get_add_permission(self): """ This method has been deprecated in favor of `django.contrib.auth.get_permission_codename`. refs #20642 """ warnings.warn( "`Options.get_add_permission` has been deprecated in favor " "of `django.contrib.auth.get_permission_codename`.", PendingDeprecationWarning, stacklevel=2) return ''add_%s'' % self.model_name

Y ese es el caso de todos esos métodos get_foo_permission

[X] 4. Add "has_view_permission" to default admin class debe ser:

def has_view_permission(self, request, obj=None): """ Returns True if the given request has permission to change or view the given Django model instance. If obj is None, this should return True if the given request has permission to change *any* object of the given type. """ opts = self.opts codename = get_permission_codename(''view'', opts) return self.has_change_permission(request, obj) or / request.user.has_perm("%s.%s" % (opts.app_label, codename))

si el modelo es en línea, verifique que esté correcto, por lo que debe conocer la vista correcta

def get_inline_instances(self, request, obj=None): ... if not (inline.has_add_permission(request) or inline.has_change_permission(request, obj) or inline.has_delete_permission(request, obj) or inline.has_view_permission(request, obj)): # add the view right continue ...

Haz la modificación en get_model_perms para incluir ''view'', en la misma idea haz esto:

def render_change_form(self, request, context, add=False, change=False, form_url='''', obj=None): ... context.update({ ... ''has_view_permission'': self.has_view_permission(request, obj), # add the view right ... }) ....

Permita que la ''vista correcta'' represente la página (de un objeto) y deshabilite la ''vista derecha'' para guardar la modificación realizada en una página evite [X] 8. Modify "view" permission to make form read only

@csrf_protect_m @transaction.atomic def change_view(self, request, object_id, form_url='''', extra_context=None): "The ''change'' admin view for this model." model = self.model opts = model._meta obj = self.get_object(request, unquote(object_id)) # addthe view right if not (self.has_view_permission(request, obj) or self.has_change_permission(request, obj)): raise PermissionDenied ... inline_instances = self.get_inline_instances(request, obj) # do not save the change if I''m not allowed to: if request.method == ''POST'' and self.has_change_permission(request, obj): form = ModelForm(request.POST, request.FILES, instance=obj) ...

Permita que la ''vista correcta'' represente la página (la lista de todos los objetos)

@csrf_protect_m def changelist_view(self, request, extra_context=None): """ The ''change list'' admin view for this model. """ from django.contrib.admin.views.main import ERROR_FLAG opts = self.model._meta app_label = opts.app_label # allow user with the view right to see the page if not (self.has_view_permission(request, None) or self.has_change_permission(request, None)): raise PermissionDenied ....

[X] 5. Update default template to list models if user has view permission : OK, pero para evitar modificar la plantilla html edite este archivo: contrib / admin / site.py

class AdminSite(object): @never_cache def index(self, request, extra_context=None): ... # add the view right if perms.get(''view'', False) or perms.get(''change'', False): try: model_dict[''admin_url''] = reverse(''admin:%s_%s_changelist'' % info, current_app=self.name) except NoReverseMatch: pass ... def app_index(self, request, app_label, extra_context=None): ... # add the view right if perms.get(''view'', False) or perms.get(''change'', False): try: model_dict[''admin_url''] = reverse(''admin:%s_%s_changelist'' % info, current_app=self.name) except NoReverseMatch: pass ...

[X] 6. Confirm user can "view" but not "change" the model y [X] 7. Remove "Save and Add another" button if user is viewing an item : debería estar bien, pero lo hice:

''show_save_as_new'': context[''has_add_permission''] and not is_popup and change and save_as, ''show_save'': context[''has_change_permission''],

[X] 8. Modifica el permiso "ver" para que el formulario sea solo de lectura: Ok, pero tengo otra solución, mira arriba