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)
Beispiel #2
0
 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))
Beispiel #3
0
 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)
Beispiel #4
0
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: "&nbsp;" * len(s.group(1)), text)
    text = re.sub("^(\s{1,})", lambda s: "&nbsp;" * len(s.group(1)), text)

    return text
Beispiel #5
0
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