From 962bbcbcdab445169952c0a98c911d08ec564529 Mon Sep 17 00:00:00 2001 From: Nikolay Zamotaev Date: Mon, 25 Mar 2019 17:54:52 +0300 Subject: Django version update. As a prerequisite to category icon implementation Task-number: AUTOSUITE-759 Change-Id: I2bf1f593c9f5cdeb6d77527945d35446ac23c8a8 Reviewed-by: Dominik Holland --- appstore/settings.py | 22 +++++++++++++++-- appstore/urls.py | 33 ++++++++++++------------- requirements.txt | 2 +- store/admin.py | 10 ++++---- store/api.py | 52 +++++++++++++++++++++------------------- store/migrations/0001_initial.py | 31 ++++++++++-------------- store/utilities.py | 6 +++++ 7 files changed, 88 insertions(+), 68 deletions(-) diff --git a/appstore/settings.py b/appstore/settings.py index a405491..e3edabc 100644 --- a/appstore/settings.py +++ b/appstore/settings.py @@ -64,10 +64,28 @@ SECRET_KEY = '4%(o_1zuz@^kjcarw&!5ptvk oa1-83*arn6jcm4idzy1#30' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -TEMPLATE_DEBUG = True - ALLOWED_HOSTS = [] +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': ( + "django.contrib.auth.context_processors.auth", + "django.template.context_processors.debug", + "django.template.context_processors.i18n", + "django.template.context_processors.media", + "django.template.context_processors.static", + "django.template.context_processors.tz", + "django.contrib.messages.context_processors.messages" + ), + 'debug': True + }, + }, +] + # Application definition diff --git a/appstore/urls.py b/appstore/urls.py index 4d0467f..7c99a6a 100644 --- a/appstore/urls.py +++ b/appstore/urls.py @@ -30,32 +30,33 @@ ## ############################################################################# -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url from django.contrib import admin +from store import api as store_api import settings -base_urlpatterns = patterns('', +base_urlpatterns = [ url(r'^admin/', include(admin.site.urls)), - url(r'^hello$', 'store.api.hello'), - url(r'^login$', 'store.api.login'), - url(r'^logout$', 'store.api.logout'), - url(r'^app/list$', 'store.api.appList'), - url(r'^app/icon', 'store.api.appIcon'), - url(r'^app/description', 'store.api.appDescription'), - url(r'^app/purchase', 'store.api.appPurchase'), - url(r'^app/download/(.*)$', 'store.api.appDownload'), - url(r'^category/list$', 'store.api.categoryList'), - url(r'^category/icon$', 'store.api.categoryIcon'), - url(r'^upload$', 'store.api.upload'), -) + url(r'^hello$', store_api.hello), + url(r'^login$', store_api.login), + url(r'^logout$', store_api.logout), + url(r'^app/list$', store_api.appList), + url(r'^app/icon', store_api.appIcon), + url(r'^app/description', store_api.appDescription), + url(r'^app/purchase', store_api.appPurchase), + url(r'^app/download/(.*)$', store_api.appDownload), + url(r'^category/list$', store_api.categoryList), + url(r'^category/icon$', store_api.categoryIcon), + url(r'^upload$', store_api.upload), +] prefix = '^' if settings.URL_PREFIX !='': prefix = prefix + settings.URL_PREFIX + '/' -urlpatterns = patterns('', +urlpatterns = [ url(prefix, include(base_urlpatterns)), -) +] diff --git a/requirements.txt b/requirements.txt index d1eb087..79be93a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ pkg-resources==0.0.0 PyYAML -django==1.7.9 +django==1.11 django-common pyOpenSSL M2Crypto diff --git a/store/admin.py b/store/admin.py index eff2550..f2adb23 100644 --- a/store/admin.py +++ b/store/admin.py @@ -34,7 +34,7 @@ import os from django import forms from django.conf import settings -from django.conf.urls import patterns +from django.conf.urls import include, url from django.contrib import admin from django.core.exceptions import PermissionDenied from django.shortcuts import redirect, get_object_or_404 @@ -87,10 +87,10 @@ class CategoryAdmin(admin.ModelAdmin): def get_urls(self): admin_view = self.admin_site.admin_view - urls = patterns('', - (r'^(?P\d+)/move_up/$', admin_view(self.move_up)), - (r'^(?P\d+)/move_down/$', admin_view(self.move_down)), - ) + urls = [ + url(r'^(?P\d+)/move_up/$', admin_view(self.move_up)), + url(r'^(?P\d+)/move_down/$', admin_view(self.move_down)), + ] return urls + super(CategoryAdmin, self).get_urls() def move_up(self, request, item_pk): diff --git a/store/api.py b/store/api.py index 88ceef4..63c3121 100644 --- a/store/api.py +++ b/store/api.py @@ -37,13 +37,13 @@ from django.conf import settings from django.db.models import Q, Count from django.http import HttpResponse, HttpResponseForbidden, Http404, JsonResponse from django.contrib import auth -from django.template import Context, loader from django.views.decorators.csrf import csrf_exempt from authdecorators import logged_in_or_basicauth, is_staff_member from models import App, Category, Vendor, savePackageFile from utilities import parsePackageMetadata, parseAndValidatePackageMetadata, addSignatureToPackage from utilities import packagePath, iconPath, downloadPath +from utilities import getRequestDictionary from osandarch import normalizeArch from tags import SoftwareTagList @@ -53,20 +53,20 @@ def hello(request): if settings.APPSTORE_MAINTENANCE: status = 'maintenance' - elif request.REQUEST.get("platform", "") != str(settings.APPSTORE_PLATFORM_ID): + elif getRequestDictionary(request).get("platform", "") != str(settings.APPSTORE_PLATFORM_ID): status = 'incompatible-platform' - elif request.REQUEST.get("version", "") != str(settings.APPSTORE_PLATFORM_VERSION): + elif getRequestDictionary(request).get("version", "") != str(settings.APPSTORE_PLATFORM_VERSION): status = 'incompatible-version' for j in ("require_tag", "conflicts_tag",): - if j in request.REQUEST: #Tags are coma-separated, + if j in getRequestDictionary(request): #Tags are coma-separated, versionmap = SoftwareTagList() - if not versionmap.parse(request.REQUEST[j]): + if not versionmap.parse(getRequestDictionary(request)[j]): status = 'malformed-tag' break request.session[j] = str(versionmap) - if 'architecture' in request.REQUEST: - request.session['architecture'] = normalizeArch(request.REQUEST['architecture']) + if 'architecture' in getRequestDictionary(request): + request.session['architecture'] = normalizeArch(getRequestDictionary(request)['architecture']) else: request.session['architecture'] = '' return JsonResponse({'status': status}) @@ -74,11 +74,10 @@ def hello(request): def login(request): status = 'ok' - try: try: - username = request.REQUEST["username"] - password = request.REQUEST["password"] + username = getRequestDictionary(request)["username"] + password = getRequestDictionary(request)["password"] except KeyError: raise Exception('missing-credentials') @@ -114,19 +113,19 @@ def upload(request): status = 'ok' try: try: - description = request.REQUEST["description"] + description = getRequestDictionary(request)["description"] except: raise Exception('no description') try: - shortdescription = request.REQUEST["short-description"] + shortdescription = getRequestDictionary(request)["short-description"] except: raise Exception('no short description') try: - category_name = request.REQUEST["category"] + category_name = getRequestDictionary(request)["category"] except: raise Exception('no category') try: - vendor_name = request.REQUEST["vendor"] + vendor_name = getRequestDictionary(request)["vendor"] except: raise Exception('no vendor') @@ -159,10 +158,10 @@ def upload(request): def appList(request): apps = App.objects.all() - if 'filter' in request.REQUEST: - apps = apps.filter(name__contains = request.REQUEST['filter']) - if 'category_id' in request.REQUEST: - catId = request.REQUEST['category_id'] + if 'filter' in getRequestDictionary(request): + apps = apps.filter(name__contains = getRequestDictionary(request)['filter']) + if 'category_id' in getRequestDictionary(request): + catId = getRequestDictionary(request)['category_id'] if catId != -1: # All metacategory apps = apps.filter(category__exact = catId) @@ -223,27 +222,29 @@ def appDescription(request): archlist = ['All', ] if 'architecture' in request.session: archlist.append(request.session['architecture']) + appId = getRequestDictionary(request)['id'] try: - app = App.objects.get(appid__exact = request.REQUEST['id'], architecture__in = archlist).order_by('architecture') + app = App.objects.get(appid__exact = appId, architecture__in = archlist).order_by('architecture') app = app.last() return HttpResponse(app.description) except: - raise Http404('no such application: %s' % request.REQUEST['id']) + raise Http404('no such application: %s' % appId) def appIcon(request): archlist = ['All', ] if 'architecture' in request.session: archlist.append(request.session['architecture']) + appId = getRequestDictionary(request)['id'] try: - app = App.objects.filter(appid__exact = request.REQUEST['id'], architecture__in = archlist).order_by('architecture') + app = App.objects.filter(appid__exact = appId, architecture__in = archlist).order_by('architecture') app = app.last() with open(iconPath(app.appid,app.architecture), 'rb') as iconPng: response = HttpResponse(content_type = 'image/png') response.write(iconPng.read()) return response except: - raise Http404('no such application: %s' % request.REQUEST['id']) + raise Http404('no such application: %s' % appId) def appPurchase(request): @@ -253,14 +254,14 @@ def appPurchase(request): if 'architecture' in request.session: archlist.append(request.session['architecture']) try: - deviceId = str(request.REQUEST.get("device_id", "")) + deviceId = str(getRequestDictionary(request).get("device_id", "")) if settings.APPSTORE_BIND_TO_DEVICE_ID: if not deviceId: return JsonResponse({'status': 'failed', 'error': 'device_id required'}) else: deviceId = '' - app = App.objects.filter(appid__exact = request.REQUEST['id'], architecture__in=archlist).order_by('architecture') + app = App.objects.filter(appid__exact = getRequestDictionary(request)['id'], architecture__in=archlist).order_by('architecture') app = app.last() fromFilePath = packagePath(app.appid, app.architecture) @@ -314,10 +315,11 @@ def categoryList(request): def categoryIcon(request): response = HttpResponse(content_type = 'image/png') + categoryId = getRequestDictionary(request)['id'] # there are no category icons (yet), so we just return the icon of the first app in this category try: - app = App.objects.filter(category__exact = request.REQUEST['id']).order_by('-dateModified')[0] #FIXME - the category icon is unimplemented + app = App.objects.filter(category__exact = categoryId).order_by('-dateModified')[0] #FIXME - the category icon is unimplemented with open(iconPath(app.appid,app.architecture), 'rb') as iconPng: response.write(iconPng.read()) except: diff --git a/store/migrations/0001_initial.py b/store/migrations/0001_initial.py index 51b0677..bde513e 100644 --- a/store/migrations/0001_initial.py +++ b/store/migrations/0001_initial.py @@ -31,24 +31,28 @@ ## ############################################################################# +# Generated by Django 1.11 on 2019-03-25 14:51 from __future__ import unicode_literals -from django.db import models, migrations from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion import store.models class Migration(migrations.Migration): + initial = True + dependencies = [ - ('auth', '0001_initial'), + ('auth', '0008_alter_user_username_max_length'), ] operations = [ migrations.CreateModel( name='App', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('appid', models.CharField(max_length=200)), ('name', models.CharField(max_length=200)), ('file', models.FileField(storage=store.models.OverwriteStorage(), upload_to=store.models.content_file_name)), @@ -60,43 +64,32 @@ class Migration(migrations.Migration): ('architecture', models.CharField(default=b'All', max_length=20)), ('version', models.CharField(default=b'0.0.0', max_length=20)), ], - options={ - }, - bases=(models.Model,), ), migrations.CreateModel( name='Category', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=200)), - ('rank', models.SmallIntegerField(unique=True, db_index=True)), + ('rank', models.SmallIntegerField(db_index=True, unique=True)), ], - options={ - }, - bases=(models.Model,), ), migrations.CreateModel( name='Vendor', fields=[ - ('user', models.ForeignKey(primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), ('name', models.CharField(max_length=200)), ('certificate', models.TextField(max_length=8000)), ], - options={ - }, - bases=(models.Model,), ), migrations.AddField( model_name='app', name='category', - field=models.ForeignKey(to='store.Category'), - preserve_default=True, + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='store.Category'), ), migrations.AddField( model_name='app', name='vendor', - field=models.ForeignKey(to='store.Vendor'), - preserve_default=True, + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='store.Vendor'), ), migrations.AlterUniqueTogether( name='app', diff --git a/store/utilities.py b/store/utilities.py index 42f78f7..8a72661 100644 --- a/store/utilities.py +++ b/store/utilities.py @@ -57,6 +57,12 @@ def makeTagList(pkgdata): taglist.append(SoftwareTag(i)) return str(taglist) +def getRequestDictionary(request): + if request.method == "POST": + return request.POST + else: + return request.GET + def packagePath(appId = None, architecture = None): path = settings.MEDIA_ROOT + 'packages/' if (appId is not None) and (architecture is not None): -- cgit v1.2.3