コード例 #1
0
ファイル: views.py プロジェクト: ygbourhis/django_doc4
def list_packages(request, query=None, Model=None, field=None, provider=None, distribution=None, architecture=None, branch=None, section=None):
    repo_values = [provider, distribution, architecture, branch, section]
    view_name = resolve(request.path_info).url_name
    api_view_name = view_name + '_api'
    searched = False
    filtered = False
    #Are we called by a search query? How do we fill the search form?:
    if request.method == 'POST':
        #We are called by a request after the form was filled
        searchform = SearchForm(request.POST)
        if searchform.is_valid():
            search_elt = searchform.cleaned_data['search_elt']
            #search_value = searchform.cleaned_data['search_value'].strip().strip('/')
            search_value = searchform.cleaned_data['search_value'].strip()
            #search_value = urlquote(searchform.cleaned_data['search_value'].strip())
            search_values = search_value.split('/')
            #for index, elt in enumerate(search_values):
            #    search_values[index] = urlquote(elt)
            if len(search_values) and search_elt !='nothing':
                search_values.append('')
                url_elts = ['/', DOC4_BASE_URL, 'packages', search_elt]
                url_elts.extend(search_values)
                #redirect_url = os.path.join(*url_elts)
                redirect_url = '/'.join(url_elts)
            else:
                #redirect_url = os.path.join( '/', DOC4_BASE_URL, 'packages')
                redirect_url = os.path.join( '/', DOC4_BASE_URL)
            get_elts = request.GET.copy()
            for key, value in get_elts.items():
                if not len(value):
                    get_elts.pop(key)
            if get_elts.has_key('page'):
                get_elts.pop('page')
            get_dict = get_elts.urlencode()
            if get_dict:
                redirect_url = '%s?%s' % (redirect_url, get_dict) 
            return HttpResponseRedirect(redirect_url)
    else:
        search_elt = ''
        search_value = ''
        #We are called by a GET request
        if field in form_fields:
            search_elt = field
            if search_elt == 'log':
                search_elt = 'changelog'
            elif search_elt == 'name' and Model is File:
                search_elt = 'file'
        else:
            search_elt = 'name'
        if query:
            search_value = query
        elif repo_values.count(None) < len(repo_values):
            for index, value in enumerate(repo_values):
                if value is None:
                    repo_values[index] = ''
            search_value = '/'.join(repo_values)
            search_elt = 'repository'
        searchform = SearchForm(initial={'search_elt' : search_elt, 'search_value' : search_value})
    
    #Now fill the filter forms:
    filterform, filtersuggest = get_filters(request)
    
    #Get package_list:
    package_list = get_package_list(request, query, Model, field, provider, distribution, architecture, branch, section)
    
    total_packages_unfiltered = package_list.count()
    package_list = filter_by_repos_and_arch(request, package_list)
    package_list = filter_by_categories(request, package_list)
    
    #What categories do the packages list belong to:
    if field is not None and field == 'category':
        category, sub_categories = Category.get_categories(package_list, query)
    else:
        category, sub_categories = Category.get_categories(package_list)
    
    #Paginate output:
    paginator, packages = paginate(request, package_list, 25)
    
    total_packages = paginator.object_list.count()
    displayed_packages = packages.object_list.count()
    if total_packages < total_packages_unfiltered:
        filtered = total_packages_unfiltered - total_packages
    
    extra_context = {
        'filterform' : filterform,
        'filtersuggest' : filtersuggest,
        'searchform' : searchform,
        'packages' : packages,
        'total_packages' : total_packages,
        'total_packages_unfiltered' : total_packages_unfiltered,
        'displayed_packages' : displayed_packages,
        'category' : category,
        'sub_categories' : sub_categories,
        'searched' : searched,
        'filtered' : filtered,
        'view_name' : view_name,
        'api_view_name' : api_view_name,
        }
    
    return object_list(request,
                       queryset = package_list,
                       extra_context = extra_context
                      )