Skip to content

Commit

Permalink
Merge branch 'master' into update_django
Browse files Browse the repository at this point in the history
  • Loading branch information
Xpirix authored Feb 12, 2024
2 parents 8559721 + 998e0b5 commit 8c46fed
Show file tree
Hide file tree
Showing 55 changed files with 7,532 additions and 117 deletions.
12 changes: 9 additions & 3 deletions REQUIREMENTS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@ Markdown==2.3.1
#PIL==1.1.7
Pillow
Pygments==2.7.4
git+https://github.com/Xpirix/whoosh.git

# Updates for Django 2 & Python 3.7
git+https://github.com/Xpirix/whoosh.git@a306553
pickle5==0.0.12
django-haystack==3.2.1

argparse==1.2.1
#cab==0.2.0 # Not used anymore..-
#distribute==0.7.3
Expand All @@ -25,7 +29,6 @@ django-debug-toolbar==3.2.4
django-endless-pagination==2.0
django-extensions==1.2.0
django-generic-aggregation==0.3.2
django-haystack==2.4.0
#django-olwidget==0.61.0 unmaintained, use this fork
git+https://github.com/Christophe31/olwidget.git
django-pagination==1.0.7
Expand All @@ -37,7 +40,7 @@ git+https://github.com/gelo-zhukov/django-ratings.git
django-simple-ratings==0.3.2
# SIMPLEMENU
git+https://github.com/elpaso/django-simplemenu.git
django-taggit==0.14.0
django-taggit==2.0.0
django-taggit-autosuggest==0.2.7
django-taggit-templatetags==0.4.6dev0
django-templatetag-sugar==0.1
Expand All @@ -60,5 +63,8 @@ django-bootstrap-pagination==1.7.1
django-sortable-listview==0.43
django-user-map
djangorestframework==3.12.2
pyjwt==1.7.1
djangorestframework-simplejwt==4.4
django-rest-auth==0.9.5
drf-yasg
django-matomo==0.1.6
2 changes: 1 addition & 1 deletion dockerize/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version: '3'
version: '3.8'
volumes:
backups-data:
static-data:
Expand Down
3 changes: 2 additions & 1 deletion dockerize/docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ ADD dockerize/docker/uwsgi.conf /uwsgi.conf
ADD qgis-app /home/web/django_project
ADD dockerize/docker/REQUIREMENTS.txt /REQUIREMENTS.txt
RUN pip install --upgrade pip && pip install -r /REQUIREMENTS.txt
RUN pip install uwsgi
RUN pip install uwsgi freezegun==1.3.1


# Open port 8080 as we will be running our uwsgi socket on that
EXPOSE 8080
Expand Down
13 changes: 9 additions & 4 deletions dockerize/docker/REQUIREMENTS.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
django==3.2.11
django-auth-ldap
python-ldap
django-taggit
django-taggit==2.0.0
django-tinymce==3.4.0
psycopg2
# Updates for Django 2
Expand All @@ -22,12 +22,13 @@ django-bootstrap-pagination
django-sortable-listview
sorl-thumbnail
django-extensions

django-debug-toolbar==3.2.4

# Updates for Django 3 & Python 3.7
git+https://github.com/Xpirix/whoosh.git
# Updates for Django 2 & Python 3.7
git+https://github.com/Xpirix/whoosh.git@a306553
pickle5==0.0.12
django-haystack
django-haystack==3.2.1

# Feedjack==0.9.18
# So use George's fork rather
Expand All @@ -50,10 +51,14 @@ requests==2.23.0
markdown==3.2.1

djangorestframework==3.11.2
pyjwt==1.7.1
djangorestframework-simplejwt==4.4

sorl-thumbnail-serializer-field==0.2.1
django-rest-auth==0.9.5
drf-yasg==1.17.1
django-rest-multiple-models==2.1.3

django-preferences==1.0.0
PyWavefront==1.3.3
django-matomo==0.1.6
8 changes: 4 additions & 4 deletions qgis-app/REQUIREMENTS_plugins.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
django==3.2.11
django-auth-ldap
python-ldap
django-taggit
django-taggit==2.0.0
django-tinymce==3.4.0
psycopg2
# Updates for Django 2
Expand All @@ -24,7 +24,7 @@ sorl-thumbnail
django-extensions
django-debug-toolbar==3.2.4

# Updates for Django 3 & Python 3.7
git+https://github.com/Xpirix/whoosh.git
# Updates for Django 2 & Python 3.7
git+https://github.com/Xpirix/whoosh.git@a306553
pickle5==0.0.12
django-haystack
django-haystack==3.2.1
7 changes: 4 additions & 3 deletions qgis-app/base/views/processing_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
View,
)
from django.views.generic.base import ContextMixin
from django.utils.encoding import escape_uri_path

GROUP_NAME = "Style Managers"

Expand Down Expand Up @@ -306,6 +307,7 @@ def get_context_data(self, **kwargs):
context["reviewer"] = reviewer
if user.is_staff or is_resources_manager(user):
context["form"] = ResourceBaseReviewForm(resource_name=self.resource_name)
context["is_style_manager"] = is_resources_manager(user)
if self.is_3d_model:
context["url_viewer"] = "%s_viewer" % self.resource_name_url_base
return context
Expand Down Expand Up @@ -484,9 +486,8 @@ def get(self, request, *args, **kwargs):
response = HttpResponse(
zipfile.getvalue(), content_type="application/x-zip-compressed"
)
response["Content-Disposition"] = "attachment; filename=%s.zip" % (
slugify(object.name, allow_unicode=True)
)
zip_name = slugify(object.name, allow_unicode=True)
response["Content-Disposition"] = f"attachment; filename*=utf-8''{escape_uri_path(zip_name)}.zip"
return response


Expand Down
6 changes: 3 additions & 3 deletions qgis-app/fixtures/auth.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"last_login": "2010-11-24 07:56:12",
"groups": [],
"user_permissions": [],
"password": "sha1$d6c11$4f3f04e104dc8bbe7950234f0cd8406a65df0bdf",
"password": "pbkdf2_sha256$150000$foQAQGi54z25$AQelhq+oBE3TOBJRT9F9UsEP5K1PSWQnQeozkmyc3fs=",
"email": "",
"date_joined": "2010-11-24 07:56:12"
}
Expand All @@ -30,7 +30,7 @@
"last_login": "2010-11-25 07:35:07",
"groups": [],
"user_permissions": [],
"password": "sha1$9ba9f$6088ef8abc2243a55e777e937159c8f2fd4920bb",
"password": "pbkdf2_sha256$150000$BBba4NloaWZO$XN4lzpxcvFSrLl1QqiwQz/0ZLiEH/JTgEJE/uRRXWto=",
"email": "[email protected]",
"date_joined": "2009-10-06 18:04:20"
}
Expand All @@ -48,7 +48,7 @@
"last_login": "2010-11-25 07:35:20",
"groups": [],
"user_permissions": [],
"password": "sha1$cb97a$221727796b3f551e342dca9d00112f072e399182",
"password": "pbkdf2_sha256$150000$GJga5YEinaWz$zJAjCXccvWHNPGmoZEjvBNgm1DGkjZGA3BmTVaNAxP4=",
"email": "",
"date_joined": "2010-11-25 07:35:20"
}
Expand Down
39 changes: 39 additions & 0 deletions qgis-app/plugins/decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from functools import wraps
from django.http import HttpResponseForbidden
from rest_framework_simplejwt.authentication import JWTAuthentication
from plugins.models import Plugin, PluginOutstandingToken
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
from rest_framework_simplejwt.token_blacklist.models import BlacklistedToken, OutstandingToken
import datetime

def has_valid_token(function):
@wraps(function)
def wrap(request, *args, **kwargs):
auth_token = request.META.get("HTTP_AUTHORIZATION")
package_name = kwargs.get('package_name')
if not str(auth_token).startswith('Bearer'):
raise InvalidToken("Invalid token")

# Validate JWT token
authentication = JWTAuthentication()
try:
validated_token = authentication.get_validated_token(auth_token[7:])
plugin_id = validated_token.payload.get('plugin_id')
jti = validated_token.payload.get('refresh_jti')
token_id = OutstandingToken.objects.get(jti=jti).pk
is_blacklisted = BlacklistedToken.objects.filter(token_id=token_id).exists()
if not plugin_id or is_blacklisted:
raise InvalidToken("Invalid token")

plugin = Plugin.objects.get(pk=plugin_id)
if not plugin or plugin.package_name != package_name:
raise InvalidToken("Invalid token")
plugin_token = PluginOutstandingToken.objects.get(token__pk=token_id, plugin=plugin)
plugin_token.last_used_on = datetime.datetime.now()
plugin_token.save()
request.plugin_token = plugin_token
return function(request, *args, **kwargs)
except (InvalidToken, TokenError) as e:
return HttpResponseForbidden(str(e))

return wrap
28 changes: 27 additions & 1 deletion qgis-app/plugins/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.forms import CharField, ModelForm, ValidationError
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from plugins.models import Plugin, PluginVersion, PluginVersionFeedback
from plugins.models import Plugin, PluginOutstandingToken, PluginVersion, PluginVersionFeedback
from plugins.validator import validator
from taggit.forms import *

Expand Down Expand Up @@ -43,10 +43,25 @@ class Meta:
"tracker",
"repository",
"owners",
"maintainer",
"display_created_by",
"tags",
"server",
)

def __init__(self, *args, **kwargs):
super(PluginForm, self).__init__(*args, **kwargs)
self.fields['owners'].label = "Collaborators"

choices = (
(self.instance.created_by.pk, self.instance.created_by.username + " (Plugin creator)"),
)
for owner in self.instance.owners.exclude(pk=self.instance.created_by.pk):
choices += ((owner.pk, owner.username + " (Collaborator)"),)

self.fields['maintainer'].choices = choices
self.fields['maintainer'].label = "Maintainer"

def clean(self):
"""
Check author
Expand Down Expand Up @@ -244,3 +259,14 @@ def clean(self):
self.cleaned_data['tasks'] = tasks

return self.cleaned_data

class PluginTokenForm(ModelForm):
"""
Form for token description editing
"""

class Meta:
model = PluginOutstandingToken
fields = (
"description",
)
38 changes: 38 additions & 0 deletions qgis-app/plugins/management/commands/cleanmediafolder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import os
from shutil import rmtree
from django.conf import settings
from django.core.management import call_command
from django.core.management.base import BaseCommand

class Command(BaseCommand):
help = 'Run collectstatic and delete folders from media that exist in static'

def handle(self, *args, **options):
confirm = input("Do you want to run 'collectstatic' first? (yes/no): ")
if confirm.lower() == 'yes':
# Run collectstatic command
call_command('collectstatic', interactive=False)

# Get the paths of static and media folders
static_root = settings.STATIC_ROOT
media_root = settings.MEDIA_ROOT

# Iterate over each directory in the static folder
for static_dir in os.listdir(static_root):
static_path = os.path.join(static_root, static_dir)

# Check if the path is a directory and exists in the media folder
if os.path.isdir(static_path) and os.path.exists(os.path.join(media_root, static_dir)):
confirm = input(f"Are you sure you want to delete '{static_dir}' from the media folder? (yes/no): ")

if confirm.lower() == 'yes':
try:
# Delete the corresponding folder in the media folder
rmtree(os.path.join(media_root, static_dir))
self.stdout.write(self.style.SUCCESS(f'Deleted {static_dir} from media folder.'))
except Exception as e:
self.stderr.write(self.style.ERROR(f'Error deleting {static_dir}: {str(e)}'))
else:
self.stdout.write(self.style.WARNING(f'Skipped deletion of {static_dir}.'))

self.stdout.write(self.style.SUCCESS('The media folder has been cleaned.'))
40 changes: 40 additions & 0 deletions qgis-app/plugins/management/commands/organize_old_package.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# myapp/management/commands/organize_packages.py
import os
import shutil
from django.core.management.base import BaseCommand
from django.conf import settings
from plugins.models import PluginVersion

PLUGINS_STORAGE_PATH = getattr(settings, "PLUGINS_STORAGE_PATH", "packages")
class Command(BaseCommand):
help = 'Organize packages created before 2014 into folders by year'

def handle(self, *args, **options):
packages_dir = os.path.join(settings.MEDIA_ROOT, PLUGINS_STORAGE_PATH)

# Some of the packages created on 2014 also need to be organized
versions = PluginVersion.objects.filter(created_on__lt='2014-12-31').exclude(package__icontains='2014/')
self.stdout.write(self.style.NOTICE(f'{versions.count()} packages will be organized.'))

for version in versions:
year_folder = os.path.join(packages_dir, str(version.created_on.year))

# Create the year folder if it doesn't exist
os.makedirs(year_folder, exist_ok=True)

# Copy the package file to the year folder
old_path = version.package.path
if os.path.exists(old_path):
new_path = os.path.join(year_folder, os.path.basename(old_path))
if not os.path.exists(new_path):
shutil.copy(old_path, year_folder)

# Update the model with the new package path
version.package.name = os.path.relpath(new_path, settings.MEDIA_ROOT)
version.save()
else:
self.stdout.write(self.style.WARNING(f'Plugin version id {version.pk} ignored: {new_path} already exists.'))
else:
self.stdout.write(self.style.WARNING(f'Plugin version id {version.pk} ignored: {old_path} is not found.'))

self.stdout.write(self.style.SUCCESS('Packages organized successfully'))
6 changes: 2 additions & 4 deletions qgis-app/plugins/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# Author: A. Pasotti

from django.contrib import auth
from django.contrib.auth.models import User

from rest_framework_simplejwt.authentication import JWTAuthentication

def HttpAuthMiddleware(get_response):
"""
Expand All @@ -12,7 +11,7 @@ def HttpAuthMiddleware(get_response):

def middleware(request):
auth_basic = request.META.get("HTTP_AUTHORIZATION")
if auth_basic:
if auth_basic and not str(auth_basic).startswith('Bearer'):
import base64

username, dummy, password = base64.decodestring(
Expand All @@ -27,7 +26,6 @@ def middleware(request):
# by logging the user in.
request.user = user
auth.login(request, user)

response = get_response(request)

# Code to be executed for each request/response after
Expand Down
14 changes: 14 additions & 0 deletions qgis-app/plugins/migrations/0004_merge_20231122_0223.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 2.2.25 on 2023-11-30 05:13

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('plugins', '0002_plugins_feedback'),
('plugins', '0003_plugin_allow_update_name'),
]

operations = [
]
Loading

0 comments on commit 8c46fed

Please sign in to comment.