Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add models #6

Merged
merged 36 commits into from
Jun 6, 2024
Merged
Changes from 1 commit
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
ff12500
Add layer model
meomancer May 16, 2024
dac0305
Add import function
meomancer May 16, 2024
b6baee2
Add vector tile url
meomancer May 16, 2024
b5c57f4
Add tests
meomancer May 16, 2024
2c748f0
Add fields on Layer
meomancer May 17, 2024
99b873d
Add API
meomancer May 17, 2024
b065fdb
Add api tests
meomancer May 17, 2024
11fda95
Add permission
meomancer May 20, 2024
f47e71e
Add multi tenants
meomancer May 20, 2024
656e359
Add installer
meomancer May 20, 2024
c5ec6bc
Remove tenants
meomancer May 22, 2024
2cfb28a
Add layer type field
meomancer May 22, 2024
836ae3e
Update models
meomancer May 23, 2024
73ba283
Fix tests
meomancer May 23, 2024
7f23297
Add style model
meomancer May 23, 2024
0dfb737
Update layer fields
meomancer May 23, 2024
82ed05a
Add upload layer
meomancer May 30, 2024
2f75eec
Add style defaults
meomancer May 30, 2024
6c7ccef
Refactor code
meomancer May 31, 2024
6bafda1
Add editor url
meomancer May 31, 2024
caea79e
Integrate maputnik
meomancer Jun 4, 2024
b583aa7
Fix maputnik static url
meomancer Jun 4, 2024
a3f07a3
Add is default
meomancer Jun 4, 2024
bb1d79e
Update tests
meomancer Jun 4, 2024
c371c25
Test
meomancer Jun 4, 2024
8dae2fe
Change app name
meomancer Jun 4, 2024
01aac50
Update maputnik
meomancer Jun 5, 2024
e068940
Update models
meomancer Jun 5, 2024
f4c0854
Change term Field to Attribute
meomancer Jun 5, 2024
243b1e6
Add extra metadata
meomancer Jun 5, 2024
5e3545e
Fix flake error
meomancer Jun 6, 2024
00ea7a3
Fix flake error
meomancer Jun 6, 2024
22049cf
Clean code
meomancer Jun 6, 2024
79b5b39
Fix init
meomancer Jun 6, 2024
8352898
Fix flake
meomancer Jun 6, 2024
b0fc8c3
Fix all tests not being called
meomancer Jun 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add layer model
meomancer committed May 16, 2024
commit ff12500b53bbec03907b400d1b5155d396fc04ed
5 changes: 0 additions & 5 deletions deployment/docker-compose.override.devcontainer.yml
Original file line number Diff line number Diff line change
@@ -3,11 +3,6 @@ services:
db:
volumes:
- ./volumes/database:/opt/postgres/data
- ./volumes/backups:/backups

dbbackups:
volumes:
- ./volumes/backups:/backups

worker:
image: kartoza/${COMPOSE_PROJECT_NAME:-django_project}_dev
1 change: 0 additions & 1 deletion deployment/docker-compose.override.template.yml
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@ services:
db:
volumes:
- ./volumes/database:/opt/postgres/data
- ./volumes/backups:/backups
ports:
- "${DATABASE_PORT:-6432}:5432"

1 change: 0 additions & 1 deletion deployment/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@ volumes:
conf-data:
database:
nginx-cache:
backups-data:
data-volume:

x-common-django:
1 change: 1 addition & 0 deletions django_project/context_layer/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Context Layer Management."""
3 changes: 3 additions & 0 deletions django_project/context_layer/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""Context Layer Management."""

from .layer import *
34 changes: 34 additions & 0 deletions django_project/context_layer/admin/layer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""Context Layer Management."""
import os

from django.contrib import admin
from django.utils.html import mark_safe # Newer versions

from context_layer.forms.layer import LayerForm
from context_layer.models.layer import Layer


class LayerAdmin(admin.ModelAdmin):
"""Layer admin."""

list_display = ('unique_id', 'name', 'created_by', 'created_at', 'files')
form = LayerForm

def get_form(self, request, *args, **kwargs):
"""Return form."""
form = super(LayerAdmin, self).get_form(request, *args, **kwargs)
form.user = request.user
return form

def files(self, obj: Layer):
"""Return files list."""
return mark_safe(
'<br/>'.join([
f'<a href="{os.path.join(obj.url, f)}">{f}</a>'
for f in os.listdir(obj.folder) if
os.path.isfile(os.path.join(obj.folder, f))
])
)


admin.site.register(Layer, LayerAdmin)
18 changes: 18 additions & 0 deletions django_project/context_layer/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# coding=utf-8
from __future__ import absolute_import, unicode_literals

"""
Context Layer Management.

.. note:: Context Layer App.
"""

from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _


class ContextLayerConfig(AppConfig):
"""Context Layer Config App."""

name = 'context_layer'
verbose_name = _('Context Layer')
1 change: 1 addition & 0 deletions django_project/context_layer/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Context Layer Management."""
49 changes: 49 additions & 0 deletions django_project/context_layer/forms/layer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
"""Context Layer Management."""

from django import forms
from django.core.files.storage import FileSystemStorage

from context_layer.models import Layer


class MultipleFileInput(forms.ClearableFileInput):
"""Multiple file input."""
allow_multiple_selected = True


class MultipleFileField(forms.FileField):
"""Multiple file field."""

def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)

def clean(self, data, initial=None):
single_file_clean = super().clean
if isinstance(data, (list, tuple)):
result = [single_file_clean(d, initial) for d in data]
else:
result = [single_file_clean(data, initial)]
return result


class LayerForm(forms.ModelForm):
"""Layer form."""

files = MultipleFileField()

def save(self, commit=True):
"""Save the data."""
instance = super(LayerForm, self).save(commit=False)
instance.created_by = self.user

# Save files
instance.emptying_folder()
for file in self.files.getlist('files'):
FileSystemStorage(location=instance.folder).save(file.name, file)

return instance

class Meta: # noqa: D106
model = Layer
exclude = ('unique_id',)
34 changes: 34 additions & 0 deletions django_project/context_layer/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 4.2.7 on 2024-05-16 04:02

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import uuid


class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Layer',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='The name of data.', max_length=512)),
('description', models.TextField(blank=True, null=True)),
('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('source', models.CharField(blank=True, help_text='Source of resource.', max_length=512, null=True)),
('unique_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
('created_by', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
]
1 change: 1 addition & 0 deletions django_project/context_layer/migrations/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Context Layer Management."""
3 changes: 3 additions & 0 deletions django_project/context_layer/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"""Context Layer Management."""

from .layer import *
46 changes: 46 additions & 0 deletions django_project/context_layer/models/general.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# coding=utf-8

from django.contrib.auth import get_user_model
from django.db import models
from django.utils import timezone

User = get_user_model()


class AbstractTerm(models.Model):
"""Abstract model for Term."""

name = models.CharField(
max_length=512,
help_text='The name of data.'
)
description = models.TextField(
null=True, blank=True
)

def __str__(self):
return self.name

class Meta: # noqa: D106
abstract = True


class AbstractResource(models.Model):
"""Abstract model with Resource."""

created_by = models.ForeignKey(
User, on_delete=models.CASCADE,
editable=False
)
created_at = models.DateTimeField(
default=timezone.now,
editable=False
)
source = models.CharField(
max_length=512,
null=True, blank=True,
help_text='Source of resource.'
)

class Meta: # noqa: D106
abstract = True
58 changes: 58 additions & 0 deletions django_project/context_layer/models/layer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""Context Layer Management."""

import os
import shutil
import uuid

from django.conf import settings
from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver

from context_layer.models.general import AbstractTerm, AbstractResource

FOLDER_ROOT = os.path.join(settings.MEDIA_ROOT, 'layer_files')
FOLDER_URL = os.path.join(settings.MEDIA_URL, 'layer_files')


class Layer(AbstractTerm, AbstractResource):
"""Model contains layer information."""

unique_id = models.UUIDField(
unique=True,
default=uuid.uuid4,
editable=False
)

def __str__(self):
"""Return str."""
return f'{self.name}'

@property
def folder(self) -> str:
"""Return folder path of this layer."""
return os.path.join(FOLDER_ROOT, str(self.unique_id))

@property
def url(self) -> str:
"""Return url root of this layer."""
return os.path.join(FOLDER_URL, str(self.unique_id))

# ----------------------------------------------------
# -------------------- FUNCTIONS ---------------------
# ----------------------------------------------------
def delete_folder(self):
"""Delete folder of the instance."""
if os.path.exists(self.folder):
shutil.rmtree(self.folder)

def emptying_folder(self):
"""Delete content of the folder."""
self.delete_folder()
os.makedirs(self.folder)


@receiver(post_delete, sender=Layer)
def layer_on_delete(sender, instance, using, **kwargs):
"""Delete folder when the layer deleted."""
instance.delete_folder()
Empty file.
1 change: 1 addition & 0 deletions django_project/core/settings/project.py
Original file line number Diff line number Diff line change
@@ -30,6 +30,7 @@
INSTALLED_APPS = INSTALLED_APPS + (
'core',
'frontend',
'context_layer'
)

TEMPLATES[0]['DIRS'] += [
10 changes: 5 additions & 5 deletions django_project/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -9,11 +9,11 @@ echo "STARTING DJANGO ENTRYPOINT $(date)"
echo "-----------------------------------------------------"

# Run NPM
cd /home/web/django_project/frontend
echo "npm install"
npm install --verbose
echo "npm build"
npm run build
#cd /home/web/django_project/frontend
#echo "npm install"
#npm install --verbose
#echo "npm build"
#npm run build

# Run initialization
cd /home/web/django_project