def get_urls_and_fields(self, context): include = None if hasattr(self, 'display_fields') and self.view_type == 'detail': include = getattr(self, 'display_fields') if hasattr(self, 'list_fields') and self.view_type == 'list': include = getattr(self, 'list_fields') context['fields'] = utils.get_fields(self.model, include=include) if hasattr(self, 'object') and self.object: for action in utils.INSTANCE_ACTIONS: try: nurl = utils.crud_url_name(self.model, action) if self.namespace: nurl = self.namespace + ':' + nurl url = reverse(nurl, kwargs={'pk': self.object.pk}) except NoReverseMatch: url = None context['url_%s' % action] = url for action in utils.LIST_ACTIONS: try: nurl = utils.crud_url_name(self.model, action) if self.namespace: nurl = self.namespace + ':' + nurl url = reverse(nurl) except NoReverseMatch: url = None context['url_%s' % action] = url
def get_urls(self): pre = "" try: if self.cruds_url: pre = "%s/" % self.cruds_url except AttributeError: pre = "" base_name = "%s%s/%s" % (pre, self.model._meta.app_label, self.model.__name__.lower()) urls = CRUDView.get_urls(self) urls.append( url(r"^%s/(?P<pk>[^/]+)/trigger_on_done$" % (base_name, ), self.trigger_on_done, name=utils.crud_url_name(self.model, 'trigger_on_done', prefix=self.urlprefix))) urls.append( url(r"^%s/(?P<pk>[^/]+)/pause$" % (base_name, ), self.pause, name=utils.crud_url_name(self.model, 'pause', prefix=self.urlprefix))) urls.append( url(r"^%s/(?P<pk>[^/]+)/unpause$" % (base_name, ), self.unpause, name=utils.crud_url_name(self.model, 'unpause', prefix=self.urlprefix))) return urls
def test_login_required(admin_client, client): model = Author app_label = model._meta.app_label model_lower = model.__name__.lower() actions = [ACTION_CREATE, ACTION_LIST] for a in actions: urlname = crud_url_name(model, a) url = reverse(urlname) r = client.get(url) assert r.status_code == 302 r = admin_client.get(url) assert r.status_code == 200 author = AuthorFactory.create() actions = [ACTION_DELETE, ACTION_DETAIL, ACTION_UPDATE] for a in actions: urlname = crud_url_name(model, a) url = reverse(urlname, args=[ author.pk, ]) r = client.get(url) assert r.status_code == 302 r = client.post(url) assert r.status_code == 302 r = admin_client.get(url) assert r.status_code == 200
def test_crud_url_name(): model = Author app_label = model._meta.app_label model_lower = model.__name__.lower() actions = [ ACTION_CREATE, ACTION_DELETE, ACTION_DETAIL, ACTION_LIST, ACTION_UPDATE ] for a in actions: urlname = crud_url_name(model, a) assert urlname == "%s_%s_%s" % (app_label, model_lower, a) urlname = crud_url_name(model, a, 'prefix') assert urlname == "prefix%s_%s_%s" % (app_label, model_lower, a)
def get_urls(self): pre = "" try: if self.cruds_url: pre = "%s/" % self.cruds_url except AttributeError: pre = "" base_name = "%s%s/%s" % (pre, self.model._meta.app_label, self.model.__name__.lower()) myurls = [] if 'list' in self.views_available: myurls.append( url("^%s/list$" % (base_name, ), self.list, name=utils.crud_url_name(self.model, 'list', prefix=self.urlprefix))) if 'create' in self.views_available: myurls.append( url("^%s/create$" % (base_name, ), self.create, name=utils.crud_url_name(self.model, 'create', prefix=self.urlprefix))) if 'detail' in self.views_available: myurls.append( url('^%s/(?P<pk>[^/]+)$' % (base_name, ), self.detail, name=utils.crud_url_name(self.model, 'detail', prefix=self.urlprefix))) if 'update' in self.views_available: myurls.append( url("^%s/(?P<pk>[^/]+)/update$" % (base_name, ), self.update, name=utils.crud_url_name(self.model, 'update', prefix=self.urlprefix))) if 'delete' in self.views_available: myurls.append( url(r"^%s/(?P<pk>[^/]+)/delete$" % (base_name, ), self.delete, name=utils.crud_url_name(self.model, 'delete', prefix=self.urlprefix))) myurls += self.add_inlines(base_name) return myurls
def crud_inline_url(obj, inline, action, namespace=None): all_tried_names = [] try: nurl = utils.crud_url_name(type(inline), action, base_model=obj.__class__) if namespace: nurl = namespace + ':' + nurl if action in ['delete', 'update', 'detail']: url = reverse(nurl, kwargs={'model_id': obj.pk, 'pk': inline.pk}) else: url = reverse(nurl, kwargs={'model_id': obj.pk}) except NoReverseMatch as e: all_tried_names.append((nurl, e)) # it could be that base_model is a child class and thus # the url does not exist when the inline was only defined for a # parent class no_match = True for base in obj.__class__.__bases__: try: nurl = utils.crud_url_name(type(inline), action, base_model=base) if namespace: nurl = namespace + ':' + nurl if action in ['delete', 'update', 'detail']: url = reverse(nurl, kwargs={ 'model_id': obj.pk, 'pk': inline.pk }) else: url = reverse(nurl, kwargs={'model_id': obj.pk}) no_match = False except NoReverseMatch as e: all_tried_names.append((nurl, e)) if not no_match: break if no_match: raise NoReverseMatch('No reverse match was found for any of the following url_names: "'+\ '", "'.join(n[0] for n in all_tried_names) +'". These are the raised errors: ' +\ ", ".join("{}".format(n[1]) for n in all_tried_names) ) return url
def initialize_delete(self, basename): ODeleteView = self.get_delete_view() url = utils.crud_url_name(self.model, 'list', prefix=self.urlprefix) if self.namespace: url = self.namespace + ":" + url self.delete = self.decorator_delete( ODeleteView.as_view(model=self.model, success_url=reverse_lazy(url), template_name=basename))
def get_urls(self): base_name = "%s/%s" % (self.model._meta.app_label, self.model.__name__.lower()) myurls = [] if 'list' in self.views_available: myurls.append( url("^%s/(?P<model_id>[^/]+)/list$" % (base_name, ), self.list, name=utils.crud_url_name(self.model, 'list', prefix=self.urlprefix))) if 'create' in self.views_available: myurls.append( url("^%s/(?P<model_id>[^/]+)/create$" % (base_name, ), self.create, name=utils.crud_url_name(self.model, 'create', prefix=self.urlprefix))) if 'detail' in self.views_available: myurls.append( url('^%s/(?P<model_id>[^/]+)/(?P<pk>[^/]+)$' % (base_name, ), self.detail, name=utils.crud_url_name(self.model, 'detail', prefix=self.urlprefix))) if 'update' in self.views_available: myurls.append( url("^%s/(?P<model_id>[^/]+)/(?P<pk>[^/]+)/update$" % (base_name, ), self.update, name=utils.crud_url_name(self.model, 'update', prefix=self.urlprefix))) if 'delete' in self.views_available: myurls.append( url(r"^%s/(?P<model_id>[^/]+)/(?P<pk>[^/]+)/delete$" % (base_name, ), self.delete, name=utils.crud_url_name(self.model, 'delete', prefix=self.urlprefix))) return myurls
def crud_url(obj, action, namespace=None): try: nurl = utils.crud_url_name(type(obj), action) if namespace: nurl = namespace + ':' + nurl if action in utils.LIST_ACTIONS: url = reverse(nurl) else: url = reverse(nurl, kwargs={'pk': obj.pk}) except NoReverseMatch: url = None return url
def crud_inline_url(obj, inline, action, namespace=None): try: nurl = utils.crud_url_name(type(inline), action) if namespace: nurl = namespace + ':' + nurl if action in ['delete', 'update']: url = reverse(nurl, kwargs={'model_id': obj.pk, 'pk': inline.pk}) else: url = reverse(nurl, kwargs={'model_id': obj.pk}) except NoReverseMatch: url = None return url
def initialize_update(self, basename): OUpdateView = self.get_update_view() url = utils.crud_url_name(self.model, 'list', prefix=self.urlprefix) if self.namespace: url = self.namespace + ":" + url fields = self.fields if self.update_form: fields = None self.update = self.decorator_update( OUpdateView.as_view(model=self.model, fields=fields, success_url=reverse_lazy(url), template_name=basename))
def get_urls(self): pre = "" try: if self.cruds_url: pre = "%s/" % self.cruds_url except AttributeError: pre = "" base_name = "%s%s/%s" % (pre, self.model._meta.app_label, self.model.__name__.lower()) urls = CRUDView.get_urls(self) urls.append( url(r"^%s/(?P<pk>[^/]+)/clearlock$" % (base_name, ), self.clearlock, name=utils.crud_url_name(self.model, 'clearlock', prefix=self.urlprefix))) return urls
def initialize_create(self, basename): OCreateView = self.get_create_view() url = utils.crud_url_name( self.model, 'list', prefix=self.urlprefix) if self.namespace: url = self.namespace + ":" + url fields = self.fields if self.add_form: fields = None print('>>> create_view = ' + str(OCreateView)) ocv = OCreateView.as_view( model=self.model, fields=fields, success_url=reverse_lazy(url), template_name=basename ) self.create = self.decorator_create(ocv)
def get_context_data(self, **kwargs): """ Adds available urls and names. """ context = super(CRUDMixin, self).get_context_data(**kwargs) context.update({ 'model_verbose_name': self.model._meta.verbose_name, 'model_verbose_name_plural': self.model._meta.verbose_name_plural, 'namespace': self.namespace }) include = None if hasattr(self, 'display_fields') and self.view_type == 'detail': include = getattr(self, 'display_fields') if hasattr(self, 'list_fields') and self.view_type == 'list': include = getattr(self, 'list_fields') context['fields'] = utils.get_fields(self.model, include=include) if hasattr(self, 'object') and self.object: for action in utils.INSTANCE_ACTIONS: try: nurl = utils.crud_url_name(self.model, action) if self.namespace: nurl = self.namespace + ':' + nurl url = reverse(nurl, kwargs={'pk': self.object.pk}) except NoReverseMatch: url = None context['url_%s' % action] = url for action in utils.LIST_ACTIONS: try: nurl = utils.crud_url_name(self.model, action) if self.namespace: nurl = self.namespace + ':' + nurl url = reverse(nurl) except NoReverseMatch: url = None context['url_%s' % action] = url try: context['search'] = self.search_fields except AttributeError: context['search'] = False if self.view_type == 'list' and 'q' in self.request.GET: context['q'] = self.request.GET.get('q', '') if self.view_type in ['update', 'detail']: context['inlines'] = self.inlines if 'object' not in context: context['object'] = self.model context['views_available'] = self.views_available user = self.request.user available_perms = {} for perm in self.all_perms: if self.check_perms: if perm in self.views_available: available_perms[perm] = all( [user.has_perm(x) for x in self.all_perms[perm]]) else: available_perms[perm] = False else: available_perms[perm] = True context['crud_perms'] = available_perms context['template_father'] = self.template_father context.update(self.context_rel) context['getparams'] = self.getparams return context