Ejemplo n.º 1
0
    def post(self, request):
        if not admin.site.has_permission(request):
            raise PermissionDenied

        content_types = {}

        response = {
            'success': False,
            'bookmarks': []
        }

        bookmarks_list = []
        record_id_list = []
        bookmark_name_list = []
        bookmarks = json.loads(request.body.decode('utf-8'))
        for bookmark in bookmarks:
            bookmark_name = bookmark.get('__str__', None)
            model_and_admin = get_model_and_admin(
                bookmark['content_type']['app_label'],
                bookmark['content_type']['model']
            )

            # model not registered in admin app
            if not model_and_admin:
                continue
            # user haven't permissions to app
            if not request.user.has_module_perms(bookmark['content_type']['app_label']):
                continue

            # user haven't permissions to model
            pemrs = model_and_admin[1].get_model_perms(request)
            # user have permissions to model
            if True in pemrs.values():
                ct_name = '{0}_{1}'.format(bookmark['content_type']['app_label'], bookmark['content_type']['model'])

                if not ct_name in content_types:
                    content_types.setdefault(ct_name, ContentType.objects.get(
                        app_label=bookmark['content_type']['app_label'],
                        model=bookmark['content_type']['model'])
                    )

                record_id = bookmark['record_id'] if 'record_id' in bookmark else None

                ct = content_types[ct_name]
                bookmark, create = Bookmark.objects.get_or_create(
                    content_type=ct, record_id=record_id, user=request.user
                )

                if create:
                    bookmarks_list.insert(0, bookmark)
                    record_id_list.insert(0, record_id)
                    bookmark_name_list.insert(0, bookmark_name)

                    response['success'] = True

        response['bookmarks'] = self._get_bookmarks(request, bookmarks_list, record_id_list, bookmark_name_list)

        return HttpResponse(json_serialize(
            response, serialize_related=True, simplify_related=False, fields=['content_type', 'add_url', 'admin_url', 'bookmark_name']
        ))
Ejemplo n.º 2
0
 def _get_bookmarks(self, request, bookmarks, record_id_list=None, bookmark_name_list=None):
     """
     Returns a valid user's bookmarks
     :param request:
     :return: generator
     """
     counter = -1
     for bookmark in bookmarks:
         counter += 1
         model_and_admin = get_model_and_admin(bookmark.content_type.app_label, bookmark.content_type.model)
         # model not registered in admin app
         if not model_and_admin:
             continue
         # user haven't permissions to app
         if not request.user.has_module_perms(bookmark.content_type.app_label):
             continue
         # user have permissions to model
         perms = model_and_admin[1].get_model_perms(request)
         if True in perms.values():
             urls = get_admin_urls_for_model(request, model_and_admin[0])
             bookmark.add_url = lambda: urls['add_url'] if 'add_url' in urls else ''
             if record_id_list and record_id_list[counter]:
                 bookmark.admin_url = lambda: urls['admin_url'] + record_id_list[counter] + '/'
             else:
                 bookmark.admin_url = lambda: urls['admin_url'] if 'admin_url' in urls else ''
             if bookmark_name_list and bookmark_name_list[counter]:
                 bookmark.bookmark_name = lambda: bookmark_name_list[counter]
             yield bookmark