Пример #1
0
def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.POST)
        form.setUser(request.user)
        if form.is_valid():
            request.user.set_password(form.cleaned_data["new_pass"])
            request.user.save()
            return render_response(request, "profile/password-change.html", {"form": form, "password_updated": True})
        else:
            return render_response(request, "profile/password-change.html", {"form": form})
    else:
        form = PasswordChangeForm()
        return render_response(request, "profile/password-change.html", {"form": form})
Пример #2
0
def repository_index(request):
    distributions = Distribution.objects.all()

    context = {
        'distributions': distributions,
    }
    return render_response(request, 'repository/index.html', context)
Пример #3
0
def repository_index(request):
    distributions = Distribution.objects.all()

    context = {
        'distributions': distributions,
    }
    return render_response(request, 'repository/index.html', context)
Пример #4
0
def user_profile(request):
    # form is posted
    if request.method == 'POST':
        form = ProfileEditForm(request.POST)
        if form.is_valid():
            u = request.user
            u.first_name = form.cleaned_data["firstname"]
            u.last_name = form.cleaned_data["lastname"]
            u.save()

            return render_response(request, "profile/user-profile-edit.html", {"profile_updated": True})
        else:
            return render_response(request, "profile/user-profile-edit.html", {"form": form})

    else:
        unbound_form = ProfileEditForm({"firstname": request.user.first_name, "lastname": request.user.last_name})
        return render_response(request, "profile/user-profile-edit.html", {"form": unbound_form})
Пример #5
0
def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.POST)
        form.setUser(request.user)
        if form.is_valid():
            request.user.set_password(form.cleaned_data["new_pass"])
            request.user.save()
            return render_response(request, "profile/password-change.html", {
                "form": form,
                "password_updated": True
            })
        else:
            return render_response(request, "profile/password-change.html",
                                   {"form": form})
    else:
        form = PasswordChangeForm()
        return render_response(request, "profile/password-change.html",
                               {"form": form})
Пример #6
0
def view_user_detail(request, userName):
    # FIXME: Developers and users/testers should be different

    developer = User.objects.get(username=userName)
    pending = Binary.objects.filter(resolution='pending', update__updated_by=developer)

    context = {
        'developer': developer,
        'pending': pending,
    }

    return render_response(request, 'profile/user-detail.html', context)
Пример #7
0
def view_source_detail(request, distName, distRelease, sourceName):
    """
        sourceName: <Source> section in pspec.xml
    """
    source = Source.objects.get(name=sourceName, distribution__name=distName, distribution__release=distRelease)

    LANGUAGE_CODE = request.LANGUAGE_CODE
    context = {
        'source': source,
        'LANGUAGE_CODE': LANGUAGE_CODE,
    }
    return render_response(request, 'repository/source.html', context)
Пример #8
0
def view_source_detail(request, distName, distRelease, sourceName):
    """
        sourceName: <Source> section in pspec.xml
    """
    source = Source.objects.get(name=sourceName, distribution__name=distName, distribution__release=distRelease)

    LANGUAGE_CODE = request.LANGUAGE_CODE
    context = {
        'source': source,
        'LANGUAGE_CODE': LANGUAGE_CODE,
    }
    return render_response(request, 'repository/source.html', context)
Пример #9
0
def view_user_detail(request, userName):
    # FIXME: Developers and users/testers should be different

    developer = User.objects.get(username=userName)
    pending = Binary.objects.filter(resolution='pending',
                                    update__updated_by=developer)

    context = {
        'developer': developer,
        'pending': pending,
    }

    return render_response(request, 'profile/user-detail.html', context)
Пример #10
0
def view_package_detail(request, distName, distRelease, sourceName, packageName):
    """
        sourceName: <Source> section in pspec.xml
        packageName: <Package> section in pspec.xml
    """

    package = Package.objects.get(name=packageName, source__name=sourceName, source__distribution__name=distName, source__distribution__release=distRelease)

    LANGUAGE_CODE = request.LANGUAGE_CODE
    context = {
        'package': package,
        'LANGUAGE_CODE': LANGUAGE_CODE,
    }
    return render_response(request, 'repository/package.html', context)
Пример #11
0
def view_package_detail(request, distName, distRelease, sourceName, packageName):
    """
        sourceName: <Source> section in pspec.xml
        packageName: <Package> section in pspec.xml
    """

    package = Package.objects.get(name=packageName, source__name=sourceName, source__distribution__name=distName, source__distribution__release=distRelease)

    LANGUAGE_CODE = request.LANGUAGE_CODE
    context = {
        'package': package,
        'LANGUAGE_CODE': LANGUAGE_CODE,
    }
    return render_response(request, 'repository/package.html', context)
Пример #12
0
def user_profile(request):
    # form is posted
    if request.method == 'POST':
        form = ProfileEditForm(request.POST)
        if form.is_valid():
            u = request.user
            u.first_name = form.cleaned_data["firstname"]
            u.last_name = form.cleaned_data["lastname"]
            u.save()

            return render_response(request, "profile/user-profile-edit.html",
                                   {"profile_updated": True})
        else:
            return render_response(request, "profile/user-profile-edit.html",
                                   {"form": form})

    else:
        unbound_form = ProfileEditForm({
            "firstname": request.user.first_name,
            "lastname": request.user.last_name
        })
        return render_response(request, "profile/user-profile-edit.html",
                               {"form": unbound_form})
Пример #13
0
def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            keyword = request.POST.get('keyword', '')
            #source = request.POST.get('source', False)
            #binary = request.POST.get('binary', False)
            in_package = request.POST.get('in_package', 'Binary')
            summary = request.POST.get('summary', False)
            description = request.POST.get('description', False)
            dist_name = request.POST.get('dist_name', 'Pardus')
            dist_release = request.POST.get('dist_release', '2008')
            exact = request.POST.get('exact', '')

            unified_sources = None
            unified_binaries = None

            if in_package == 'Source':
                if exact:
                    sources = Source.objects.filter(name__exact=keyword)
                    unified_sources = sources
                else:
                    sources = Source.objects.filter(name__icontains=keyword)
                    summaries = Source.objects.filter(info__summary__id = -1)
                    descriptions = Source.objects.filter(info__description__id = -1)
                    if summary:
                        summaries = Source.objects.filter(info__summary__text__icontains=keyword)
                    if description: 
                        descriptions = Source.objects.filter(info__description__text__icontains=keyword)
                    unified_sources = sources | summaries | descriptions
                    # i need to find a better way here like using set
                    #s1 = set(sources).union(set(summaries).union(set(descriptions))
                unified_sources = unified_sources.filter(distribution__name__exact=dist_name)
                unified_sources = unified_sources.filter(distribution__release__exact=dist_release)
                unified_sources = unified_sources.distinct()

            if in_package == 'Binary':
                if exact:
                    binaries = Package.objects.filter(name__exact=keyword)
                    unified_binaries = binaries
                else:
                    binaries = Package.objects.filter(name__icontains=keyword)
                    summaries = Package.objects.filter(source__info__summary__id = -1)
                    descriptions = Package.objects.filter(source__info__description__id = -1)
                    if summary:
                        summaries = Package.objects.filter(source__info__summary__text__icontains=keyword)
                    if description: 
                        descriptions = Package.objects.filter(source__info__description__text__icontains=keyword)

                    unified_binaries = binaries | summaries | descriptions
                    unified_binaries = unified_binaries.distinct()

                unified_binaries =  unified_binaries.filter(source__distribution__name__exact=dist_name)
                unified_binaries =  unified_binaries.filter(source__distribution__release__exact=dist_release)

            if unified_sources and not unified_binaries:
                result = unified_sources
                sources_len = unified_sources.count()
                binary_len = 0
            elif unified_binaries and not unified_sources:
                result = unified_binaries
                binary_len = unified_binaries.count()
                sources_len = 0
            else:
                # create an empty result
                result = Source.objects.filter(id=-1)
                sources_len = result.count()
                binary_len = 0

            sources_len = str(sources_len)
            binary_len = str(binary_len)

            # create unique ids for the cache query result
            values = str(result.values())
            result_id = hashlib.md5(values).hexdigest()
            request.session['result_id'] = result_id

            sources_len_id = hashlib.md5(sources_len).hexdigest()
            request.session['sources_len_id'] = sources_len_id
            binary_len_id = hashlib.md5(binary_len).hexdigest()
            request.session['binary_len_id'] = binary_len_id

            # set the result to the db, pagination will use results from cache when the GET request is called
            # saving the result at the dictionary is a workaround, it is nto possible to save the queryset object directly at the db
            rslt = dict()
            rslt['tmp'] = result
            cache.set(result_id, rslt)
            cache.set(sources_len_id, sources_len)
            cache.set(binary_len_id, binary_len)

            LANGUAGE_CODE = request.LANGUAGE_CODE
            # - generate dict to use in object_list
            # - django appends _list suffix to template_object_name, see: http://docs.djangoproject.com/en/1.0/ref/generic-views/
            object_dict = {
                'queryset': result,
                'paginate_by': SOURCE_PACKAGES_PER_PAGE,
                'template_name': 'repository/search_result.html',
                'template_object_name': 'packages',
                'extra_context': {'LANGUAGE_CODE': LANGUAGE_CODE, 'sources_len': sources_len, 'binary_len': binary_len}
                }

            return object_list(request, **object_dict)

    elif request.method == 'GET' and request.GET.get('page'):

        result_id = request.session.get('result_id')

        try:
            result = cache.get(result_id)['tmp']
            # default timeout is 3600 sec, if the timeout is passed, return to the form page
        except TypeError:
            return HttpResponseRedirect('./')

        sources_len_id = request.session.get('sources_len_id')
        binary_len_id = request.session.get('binary_len_id')

        sources_len = cache.get(sources_len_id)
        binary_len = cache.get(binary_len_id)
        LANGUAGE_CODE = request.LANGUAGE_CODE
        # - generate dict to use in object_list
        # - django appends _list suffix to template_object_name, see: http://docs.djangoproject.com/en/1.0/ref/generic-views/
        object_dict = {
            'queryset': result,
            'paginate_by': SOURCE_PACKAGES_PER_PAGE,
            'template_name': 'repository/search_result.html',
            'template_object_name': 'packages',
            'extra_context': {'LANGUAGE_CODE': LANGUAGE_CODE, 'sources_len': sources_len, 'binary_len': binary_len}
        }
        
        return object_list(request, **object_dict)

    else:
        form = SearchForm()

    context = {
            'form': form,
        }

    return render_response(request, 'repository/search.html', context)
Пример #14
0
def view_binary_detail(request, distName, distRelease, sourceName, packageName, binaryNo):
    """
        sourceName: <Source> section in pspec.xml
        packageName: <Package> section in pspec.xml
    """
    binary = Binary.objects.get(no=binaryNo, package__name=packageName, package__source__name=sourceName, package__source__distribution__name=distName, package__source__distribution__release=distRelease)

    # FIXME: We also handle sending ACK/NACK info. Maybe it can be done in different view?
    if request.method == "POST" and request.user and request.user.is_authenticated():
        # if this package is not updated by the latest updater, give error:
        #if binary.update.updated_by != request.user:
        #    return HttpResponse("Sorry, you can not change another developer's package. Only the developer who changed the package can give ACK.")

        if request.POST['result'] == "unknown":
            TestResult.objects.filter(binary=binary, created_by=request.user).delete()
        elif request.POST['result'] in ("yes", "no"):
            result, created = TestResult.objects.get_or_create(binary=binary, created_by=request.user)
            result.result = request.POST.get('result', 'unknown')
            result.comment = request.POST.get('comment', '')
            result.save()

    user_result = None
    if request.user and request.user.is_authenticated():
        results = binary.testresult_set.filter(created_by=request.user)
        if len(results):
            user_result = results[0]

    # get the files of the pisi package
    # it is better to download the package from a local machine, it will be faster
    base_path = 'http://packages.pardus.org.tr'
    if binary.package.source.distribution.type == 'corporate':
        distro = 'corporate'
        release = '2'
        suffix = distro + release
    else:
        distro = binary.package.source.distribution.name.lower()
        release = binary.package.source.distribution.release
        suffix = "-".join([distro, release])
    if binary.resolution == 'pending': suffix += '-test'
    path = os.path.join(base_path, suffix)
    pisi_package = binary.get_filename()
    pisi_url = os.path.join(path, pisi_package)
    tmp_path = os.path.join('/tmp', pisi_package)
    url = urllib.URLopener()
    if os.path.exists(tmp_path): os.unlink(tmp_path)
    try:
        url.retrieve(pisi_url, tmp_path)
    except IOError:
        context = {
            'msg': _('The file you requested is not at the server. There may be an update.'),
        }
        return render_response(request, 'repository/404.html', context)

    package = pisi.package.Package(tmp_path)
    files = package.get_files()
    os.unlink(tmp_path)

    context = {
        'binary': binary,
        'user_result': user_result,
        'files': files,
    }
    return render_response(request, 'repository/binary.html', context)
Пример #15
0
def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            keyword = request.POST.get('keyword', '')
            #source = request.POST.get('source', False)
            #binary = request.POST.get('binary', False)
            in_package = request.POST.get('in_package', 'Binary')
            summary = request.POST.get('summary', False)
            description = request.POST.get('description', False)
            dist_name = request.POST.get('dist_name', 'Pardus')
            dist_release = request.POST.get('dist_release', '2008')
            exact = request.POST.get('exact', '')

            unified_sources = None
            unified_binaries = None

            if in_package == 'Source':
                if exact:
                    sources = Source.objects.filter(name__exact=keyword)
                    unified_sources = sources
                else:
                    sources = Source.objects.filter(name__icontains=keyword)
                    summaries = Source.objects.filter(info__summary__id = -1)
                    descriptions = Source.objects.filter(info__description__id = -1)
                    if summary:
                        summaries = Source.objects.filter(info__summary__text__icontains=keyword)
                    if description: 
                        descriptions = Source.objects.filter(info__description__text__icontains=keyword)
                    unified_sources = sources | summaries | descriptions
                    # i need to find a better way here like using set
                    #s1 = set(sources).union(set(summaries).union(set(descriptions))
                unified_sources = unified_sources.filter(distribution__name__exact=dist_name)
                unified_sources = unified_sources.filter(distribution__release__exact=dist_release)
                unified_sources = unified_sources.distinct()

            if in_package == 'Binary':
                if exact:
                    binaries = Package.objects.filter(name__exact=keyword)
                    unified_binaries = binaries
                else:
                    binaries = Package.objects.filter(name__icontains=keyword)
                    summaries = Package.objects.filter(source__info__summary__id = -1)
                    descriptions = Package.objects.filter(source__info__description__id = -1)
                    if summary:
                        summaries = Package.objects.filter(source__info__summary__text__icontains=keyword)
                    if description: 
                        descriptions = Package.objects.filter(source__info__description__text__icontains=keyword)

                    unified_binaries = binaries | summaries | descriptions
                    unified_binaries = unified_binaries.distinct()

                unified_binaries =  unified_binaries.filter(source__distribution__name__exact=dist_name)
                unified_binaries =  unified_binaries.filter(source__distribution__release__exact=dist_release)

            if unified_sources and not unified_binaries:
                result = unified_sources
                sources_len = unified_sources.count()
                binary_len = 0
            elif unified_binaries and not unified_sources:
                result = unified_binaries
                binary_len = unified_binaries.count()
                sources_len = 0
            else:
                # create an empty result
                result = Source.objects.filter(id=-1)
                sources_len = result.count()
                binary_len = 0

            sources_len = str(sources_len)
            binary_len = str(binary_len)

            # create unique ids for the cache query result
            values = str(result.values())
            result_id = hashlib.md5(values).hexdigest()
            request.session['result_id'] = result_id

            sources_len_id = hashlib.md5(sources_len).hexdigest()
            request.session['sources_len_id'] = sources_len_id
            binary_len_id = hashlib.md5(binary_len).hexdigest()
            request.session['binary_len_id'] = binary_len_id

            # set the result to the db, pagination will use results from cache when the GET request is called
            # saving the result at the dictionary is a workaround, it is nto possible to save the queryset object directly at the db
            rslt = dict()
            rslt['tmp'] = result
            cache.set(result_id, rslt)
            cache.set(sources_len_id, sources_len)
            cache.set(binary_len_id, binary_len)

            LANGUAGE_CODE = request.LANGUAGE_CODE
            # - generate dict to use in object_list
            # - django appends _list suffix to template_object_name, see: http://docs.djangoproject.com/en/1.0/ref/generic-views/
            object_dict = {
                'queryset': result,
                'paginate_by': SOURCE_PACKAGES_PER_PAGE,
                'template_name': 'repository/search_result.html',
                'template_object_name': 'packages',
                'extra_context': {'LANGUAGE_CODE': LANGUAGE_CODE, 'sources_len': sources_len, 'binary_len': binary_len}
                }

            return object_list(request, **object_dict)

    elif request.method == 'GET' and request.GET.get('page'):

        result_id = request.session.get('result_id')

        try:
            result = cache.get(result_id)['tmp']
            # default timeout is 3600 sec, if the timeout is passed, return to the form page
        except TypeError:
            return HttpResponseRedirect('./')

        sources_len_id = request.session.get('sources_len_id')
        binary_len_id = request.session.get('binary_len_id')

        sources_len = cache.get(sources_len_id)
        binary_len = cache.get(binary_len_id)
        LANGUAGE_CODE = request.LANGUAGE_CODE
        # - generate dict to use in object_list
        # - django appends _list suffix to template_object_name, see: http://docs.djangoproject.com/en/1.0/ref/generic-views/
        object_dict = {
            'queryset': result,
            'paginate_by': SOURCE_PACKAGES_PER_PAGE,
            'template_name': 'repository/search_result.html',
            'template_object_name': 'packages',
            'extra_context': {'LANGUAGE_CODE': LANGUAGE_CODE, 'sources_len': sources_len, 'binary_len': binary_len}
        }
        
        return object_list(request, **object_dict)

    else:
        form = SearchForm()

    context = {
            'form': form,
        }

    return render_response(request, 'repository/search.html', context)
Пример #16
0
def view_binary_detail(request, distName, distRelease, sourceName, packageName, binaryNo):
    """
        sourceName: <Source> section in pspec.xml
        packageName: <Package> section in pspec.xml
    """
    binary = Binary.objects.get(no=binaryNo, package__name=packageName, package__source__name=sourceName, package__source__distribution__name=distName, package__source__distribution__release=distRelease)

    # FIXME: We also handle sending ACK/NACK info. Maybe it can be done in different view?
    if request.method == "POST" and request.user and request.user.is_authenticated():
        # if this package is not updated by the latest updater, give error:
        #if binary.update.updated_by != request.user:
        #    return HttpResponse("Sorry, you can not change another developer's package. Only the developer who changed the package can give ACK.")

        if request.POST['result'] == "unknown":
            TestResult.objects.filter(binary=binary, created_by=request.user).delete()
        elif request.POST['result'] in ("yes", "no"):
            result, created = TestResult.objects.get_or_create(binary=binary, created_by=request.user)
            result.result = request.POST.get('result', 'unknown')
            result.comment = request.POST.get('comment', '')
            result.save()

    user_result = None
    if request.user and request.user.is_authenticated():
        results = binary.testresult_set.filter(created_by=request.user)
        if len(results):
            user_result = results[0]

    # get the files of the pisi package
    # it is better to download the package from a local machine, it will be faster
    base_path = 'http://packages.pardus.org.tr'
    if binary.package.source.distribution.type == 'corporate':
        distro = 'corporate'
        release = '2'
        suffix = distro + release
    else:
        distro = binary.package.source.distribution.name.lower()
        release = binary.package.source.distribution.release
        suffix = "-".join([distro, release])
    if binary.resolution == 'pending': suffix += '-test'
    path = os.path.join(base_path, suffix)
    pisi_package = binary.get_filename()
    pisi_url = os.path.join(path, pisi_package)
    tmp_path = os.path.join('/tmp', pisi_package)
    url = urllib.URLopener()
    if os.path.exists(tmp_path): os.unlink(tmp_path)
    try:
        url.retrieve(pisi_url, tmp_path)
    except IOError:
        context = {
            'msg': _('The file you requested is not at the server. There may be an update.'),
        }
        return render_response(request, 'repository/404.html', context)

    package = pisi.package.Package(tmp_path)
    files = package.get_files()
    os.unlink(tmp_path)

    context = {
        'binary': binary,
        'user_result': user_result,
        'files': files,
    }
    return render_response(request, 'repository/binary.html', context)