def __call__(self, request, url): ''' DEPRECATED!! More recent versions of Django use the get_urls method instead. Overriden to route extra URLs. ''' if url: if url.endswith('items/add'): return self.add_menu_item(request, unquote(url[:-10])) if url.endswith('items'): return HttpResponseRedirect('../') match = re.match('^(?P<menu_pk>[-\w]+)/items/(?P<menu_item_pk>[-\w]+)$', url) if match: return self.edit_menu_item(request, match.group('menu_pk'), match.group('menu_item_pk')) match = re.match('^(?P<menu_pk>[-\w]+)/items/(?P<menu_item_pk>[-\w]+)/delete$', url) if match: return self.delete_menu_item(request, match.group('menu_pk'), match.group('menu_item_pk')) match = re.match('^(?P<menu_pk>[-\w]+)/items/(?P<menu_item_pk>[-\w]+)/history$', url) if match: return self.history_menu_item(request, match.group('menu_pk'), match.group('menu_item_pk')) match = re.match('^(?P<menu_pk>[-\w]+)/items/(?P<menu_item_pk>[-\w]+)/move_up$', url) if match: return self.move_up_item(request, match.group('menu_pk'), match.group('menu_item_pk')) match = re.match('^(?P<menu_pk>[-\w]+)/items/(?P<menu_item_pk>[-\w]+)/move_down$', url) if match: return self.move_down_item(request, match.group('menu_pk'), match.group('menu_item_pk')) return super(MenuAdmin, self).__call__(request, url)
def button_view_dispatcher(self, request, url): # Dispatch the url to a function call if url is not None: res = re.match('(.*/)?(?P<id>\d+)/(?P<command>.*)', url) if res: if res.group('command') in [b.func_name for b in self.change_buttons]: obj = self.model._default_manager.get(pk=res.group('id')) response = getattr(self, res.group('command'))(request, obj) if response is None: return HttpResponseRedirect(request.META['HTTP_REFERER']) return response else: res = re.match('(.*/)?(?P<command>.*)', url) if res: if res.group('command') in [b.func_name for b in self.list_buttons]: response = getattr(self, res.group('command'))(request) if response is None: return HttpResponseRedirect(request.META['HTTP_REFERER']) return response # Delegate to the appropriate method, based on the URL. if url is None: return self.changelist_view(request) elif url == 'add': return self.add_view(request) elif url.endswith('/history'): return self.history_view(request, unquote(url[:-8])) elif url.endswith('/delete'): return self.delete_view(request, unquote(url[:-7])) else: return self.change_view(request, unquote(url))
def replaceUlrsWithLinks(text): # Замера урлов на ссылки # word-break:break-all; для того чтобы длиные ссылки # не расширяли страницу а обрезались посредине # скобки. # Для этого перебор всех урлов. # И если урл кончается символов знака препинания его выносим за ссылку. import re urls_pat = re.compile( r"((https?):((//)|(\\\\))+[\w\d:#@%/;$~_?\+-=\\\.&\[\]]*)([)]?)", re.MULTILINE | re.UNICODE | re.IGNORECASE ) new_text = u"" last_pos = 0 for url_mo in re.finditer(urls_pat, text): url = url_mo.group() url_last = u"" while url.endswith(")") or url.endswith(".") or url.endswith(":"): url_last += url[-1] url = url[0:-1] a_elem = u'<a style="word-break:break-all;" href="{0}" class="underline" target="_blank">{0}</a>{1}'.format( url, url_last ) new_text += text[last_pos : url_mo.start()] + a_elem last_pos = url_mo.end() new_text += text[last_pos:] text = new_text # Вставляем br, переводы строки оставляем, т.к. на них ориентируется следующее рег. выражение. # \u2823 - это юникод-символ line separator http://www.fileformat.info/info/unicode/char/2028/index.htm # с какого-то момента Скайп стал их присылать (в сообщениях dJON клиента) например 6193: # http://pvoytko.ru/dj-admin/pvoytko/clientcontact/6193/?_changelist_filters=p%3D1 # если их не заменять то строки сливаются. text = text.replace("\n", "<br />\n") text = text.replace(u"\u2028", u"<br />\n") # Заменяем пустрые строки. Например, текст может быть таким: # -- # Пример списка<br /> # Пример итема<br /> # Пример итема<br /> # -- # Если такой текст вставить в DIV в HTML, то пробелы до итемов удалятся и он отобразится так: # -- # Пример списка<br /> # Пример итема<br /> # Пример итема<br /> # -- # Чтобы сохранить пробелы - заменяем все пробелы в количстве 2 и более таким же кол-вом неразрывных пробелов. # А вначале строки заменяем один и более пробел неразрывными. # Не заменяем все пробелы т.к. пробелы между словами пусть остаются разрывными, чтобы нормально строки # отображались. text = re.sub("(\s{2,})", lambda s: " " * len(s.group(1)), text) text = re.sub("^(\s{1,})", lambda s: " " * len(s.group(1)), text) return text
def _cleanup_url(url): #remove leading "/" if any while url.startswith("/") : url= url[1:] #remove trailing "/" if any while url.endswith("/") : url= url[:-1] if url and not url.endswith("/"): url+="/" return url
def _get_schema(self, start_url=None): """ Method that will build a list output describing this resource. This can be used to build a schema description for an API :param start_url: the url to start at. :return: list describing schema endpoints """ start_url = start_url or "." output = [] for name, method in self._yield_methods(key="any_endpoint"): http_method, _, name = name.partition("_") if "_" in name: is_method = True function_name, _, request_level = name.rpartition("_") else: is_method = False request_level = name url = start_url if request_level == "list": if is_method: url += "/{function_name}/".format(function_name=function_name) else: url += "/(id)/" if is_method: url += "{function_name}/".format(function_name=function_name) if not url.endswith("/"): url += "/" endpoint = dict(url=url, method=http_method.upper()) # Update with extra schema info set on the bundle, then class, then method endpoint.update(getattr(self.bundle, "schema_info", {})) endpoint.update(getattr(self.__class__, "schema_info", {})) endpoint.update(getattr(method, "schema_info", {})) # use docstring as description if necessary docstring_off = getattr(self.__class__, "docstring_off", False) if not endpoint.get("description") and not docstring_off and method.__doc__: endpoint["description"] = method.__doc__.strip() # Only output schema if there is a description and it is not marked as private. if not endpoint.get("private"): output.append(endpoint) # output sorted by url length output.sort(key=lambda endpoint: len(endpoint["url"])) # get all child resource schemas children = self.children children.sort(key=lambda res: res.resource_name) for resource in children: if getattr(resource, "schema_info", {}).get("private", False): continue name = resource.resource_name child_start = start_url + "/(id)/" + name schema = resource._get_schema(start_url=child_start) output.append({name: schema}) return output