add transfer command, models and crud api.
This commit is contained in:
parent
e3d41ecd8d
commit
b03cd4fe09
38
apps/main/management/commands/add_panels.py
Normal file
38
apps/main/management/commands/add_panels.py
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
from account.models import User
|
||||||
|
from main.models import Panel, SiteSettings
|
||||||
|
from transfer.models import Panels
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = '''Add panels from legacy DB.'''
|
||||||
|
|
||||||
|
def handle(self, *args, **kwargs):
|
||||||
|
objects = []
|
||||||
|
deleted = 0
|
||||||
|
panels_list = Panels.objects.filter(name__isnull=False)
|
||||||
|
# remove existing panel
|
||||||
|
exist_panel = Panel.objects.filter(old_id__isnull=False)
|
||||||
|
if exist_panel.exists():
|
||||||
|
deleted = exist_panel.count()
|
||||||
|
exist_panel.delete()
|
||||||
|
|
||||||
|
for old_panel in tqdm(panels_list, desc='Add panels'):
|
||||||
|
site = SiteSettings.objects.filter(old_id=old_panel.site_id).first()
|
||||||
|
user = User.objects.filter(old_id=old_panel.site_id).first()
|
||||||
|
if site:
|
||||||
|
new_panel = Panel(
|
||||||
|
old_id=old_panel.id,
|
||||||
|
user=user,
|
||||||
|
site=site,
|
||||||
|
name=old_panel.name,
|
||||||
|
display=old_panel.display,
|
||||||
|
description=old_panel.description,
|
||||||
|
query=old_panel.query,
|
||||||
|
)
|
||||||
|
objects.append(new_panel)
|
||||||
|
Panel.objects.bulk_create(objects)
|
||||||
|
self.stdout.write(
|
||||||
|
self.style.WARNING(f'Created {len(objects)}/Deleted {deleted} footer objects.'))
|
||||||
36
apps/main/migrations/0042_panel.py
Normal file
36
apps/main/migrations/0042_panel.py
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-12 12:00
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('main', '0041_auto_20191211_0631'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Panel',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
|
||||||
|
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='name')),
|
||||||
|
('display', models.CharField(blank=True, choices=[('table', 'table'), ('table', 'mailing')], default=None, max_length=255, null=True, verbose_name='display')),
|
||||||
|
('description', models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='description')),
|
||||||
|
('query', models.TextField(blank=True, default=None, null=True, verbose_name='query')),
|
||||||
|
('old_id', models.IntegerField(blank=True, default=None, null=True, verbose_name='old id')),
|
||||||
|
('site', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='main.SiteSettings', verbose_name='site')),
|
||||||
|
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='user')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'panel',
|
||||||
|
'verbose_name_plural': 'panels',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -361,3 +361,46 @@ class Footer(ProjectBaseMixin):
|
||||||
)
|
)
|
||||||
about_us = models.TextField(_('about_us'))
|
about_us = models.TextField(_('about_us'))
|
||||||
copyright = models.TextField(_('copyright'))
|
copyright = models.TextField(_('copyright'))
|
||||||
|
|
||||||
|
|
||||||
|
class PanelQuerySet(models.QuerySet):
|
||||||
|
"""Panels QuerySet."""
|
||||||
|
|
||||||
|
|
||||||
|
class Panel(ProjectBaseMixin):
|
||||||
|
"""Custom panel model with stored SQL query."""
|
||||||
|
TABLE = 'table'
|
||||||
|
MAILING = 'table'
|
||||||
|
|
||||||
|
DISPLAY_CHOICES = (
|
||||||
|
(TABLE, _('table')),
|
||||||
|
(MAILING, _('mailing'))
|
||||||
|
)
|
||||||
|
name = models.CharField(_('name'), max_length=255)
|
||||||
|
display = models.CharField(
|
||||||
|
_('display'), max_length=255, choices=DISPLAY_CHOICES,
|
||||||
|
blank=True, null=True, default=None
|
||||||
|
)
|
||||||
|
description = models.CharField(
|
||||||
|
_('description'), max_length=255, blank=True, null=True, default=None)
|
||||||
|
query = models.TextField(_('query'), blank=True, null=True, default=None)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
'account.User', verbose_name=_('user'), null=True,
|
||||||
|
on_delete=models.SET_NULL)
|
||||||
|
site = models.ForeignKey(
|
||||||
|
'main.SiteSettings', verbose_name=_('site'), null=True,
|
||||||
|
on_delete=models.SET_NULL)
|
||||||
|
old_id = models.IntegerField(
|
||||||
|
_('old id'), null=True, blank=True, default=None)
|
||||||
|
|
||||||
|
objects = PanelQuerySet.as_manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _('panel')
|
||||||
|
verbose_name_plural = _('panels')
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
def execute_query(self):
|
||||||
|
pass
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@ from rest_framework import serializers
|
||||||
from location.serializers import CountrySerializer
|
from location.serializers import CountrySerializer
|
||||||
from main import models
|
from main import models
|
||||||
from utils.serializers import ProjectModelSerializer, TranslatedField, RecursiveFieldSerializer
|
from utils.serializers import ProjectModelSerializer, TranslatedField, RecursiveFieldSerializer
|
||||||
|
from account.serializers.back import BackUserSerializer
|
||||||
|
from account.models import User
|
||||||
|
|
||||||
|
|
||||||
class FeatureSerializer(serializers.ModelSerializer):
|
class FeatureSerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -265,8 +267,32 @@ class PageTypeBaseSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
|
|
||||||
class ContentTypeBackSerializer(serializers.ModelSerializer):
|
class ContentTypeBackSerializer(serializers.ModelSerializer):
|
||||||
"""Serializer fro model ContentType."""
|
"""Serializer for model ContentType."""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ContentType
|
model = ContentType
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class PanelSerializer(serializers.ModelSerializer):
|
||||||
|
"""Serializer for Custom panel."""
|
||||||
|
user_id = serializers.PrimaryKeyRelatedField(
|
||||||
|
queryset=User.objects.all(),
|
||||||
|
source='user',
|
||||||
|
write_only=True
|
||||||
|
)
|
||||||
|
user = BackUserSerializer(read_only=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = models.Panel
|
||||||
|
fields = [
|
||||||
|
'id',
|
||||||
|
'name',
|
||||||
|
'display',
|
||||||
|
'description',
|
||||||
|
'query',
|
||||||
|
'created',
|
||||||
|
'modified',
|
||||||
|
'user',
|
||||||
|
'user_id'
|
||||||
|
]
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,11 @@ urlpatterns = [
|
||||||
path('footer/', views.FooterBackView.as_view(), name='footer-list-create'),
|
path('footer/', views.FooterBackView.as_view(), name='footer-list-create'),
|
||||||
path('footer/<int:pk>/', views.FooterRUDBackView.as_view(), name='footer-rud'),
|
path('footer/<int:pk>/', views.FooterRUDBackView.as_view(), name='footer-rud'),
|
||||||
path('page-types/', views.PageTypeListCreateView.as_view(),
|
path('page-types/', views.PageTypeListCreateView.as_view(),
|
||||||
name='page-types-list-create')
|
name='page-types-list-create'),
|
||||||
|
path('panels/', views.PanelsListCreateView.as_view(), name='panels'),
|
||||||
|
path('panels/<int:pk>/', views.PanelsListCreateView.as_view(), name='panels-rud'),
|
||||||
|
# path('panels/<int:pk>/execute/', views.PanelsView.as_view(), name='panels-execute')
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from rest_framework import generics, permissions
|
||||||
|
|
||||||
from main import serializers
|
from main import serializers
|
||||||
from main.filters import AwardFilter
|
from main.filters import AwardFilter
|
||||||
from main.models import Award, Footer, PageType
|
from main.models import Award, Footer, PageType, Panel
|
||||||
from main.views import SiteSettingsView, SiteListView
|
from main.views import SiteSettingsView, SiteListView
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -89,3 +89,21 @@ class PageTypeListCreateView(generics.ListCreateAPIView):
|
||||||
pagination_class = None
|
pagination_class = None
|
||||||
serializer_class = serializers.PageTypeBaseSerializer
|
serializer_class = serializers.PageTypeBaseSerializer
|
||||||
queryset = PageType.objects.all()
|
queryset = PageType.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class PanelsListCreateView(generics.ListCreateAPIView):
|
||||||
|
"""Custom panels view."""
|
||||||
|
permission_classes = (
|
||||||
|
permissions.IsAdminUser,
|
||||||
|
)
|
||||||
|
serializer_class = serializers.PanelSerializer
|
||||||
|
queryset = Panel.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class PanelsRUDView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
"""Custom panels view."""
|
||||||
|
permission_classes = (
|
||||||
|
permissions.IsAdminUser,
|
||||||
|
)
|
||||||
|
serializer_class = serializers.PanelSerializer
|
||||||
|
queryset = Panel.objects.all()
|
||||||
19
apps/product/migrations/0021_auto_20191212_0926.py
Normal file
19
apps/product/migrations/0021_auto_20191212_0926.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Generated by Django 2.2.7 on 2019-12-12 09:26
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('product', '0020_merge_20191209_0911'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='product',
|
||||||
|
name='product_type',
|
||||||
|
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='products', to='product.ProductType', verbose_name='Type'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -1222,3 +1222,20 @@ class Footers(MigrateMixin):
|
||||||
class Meta:
|
class Meta:
|
||||||
managed = False
|
managed = False
|
||||||
db_table = 'footers'
|
db_table = 'footers'
|
||||||
|
|
||||||
|
|
||||||
|
class Panels(MigrateMixin):
|
||||||
|
using = 'legacy'
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
display = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
description = models.CharField(max_length=255, blank=True, null=True)
|
||||||
|
query = models.TextField(blank=True, null=True)
|
||||||
|
created_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
updated_at = models.DateTimeField(blank=True, null=True)
|
||||||
|
account_id = models.IntegerField(blank=True, null=True)
|
||||||
|
site_id = models.IntegerField(blank=True, null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'panels'
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import logging
|
||||||
import random
|
import random
|
||||||
import re
|
import re
|
||||||
import string
|
import string
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
@ -124,3 +125,10 @@ def absolute_url_decorator(func):
|
||||||
def get_point_from_coordinates(latitude: str, longitude: str):
|
def get_point_from_coordinates(latitude: str, longitude: str):
|
||||||
if latitude and longitude:
|
if latitude and longitude:
|
||||||
return Point(x=longitude, y=latitude, srid=4326)
|
return Point(x=longitude, y=latitude, srid=4326)
|
||||||
|
|
||||||
|
|
||||||
|
def namedtuplefetchall(cursor):
|
||||||
|
"""Return all rows from a cursor as a namedtuple."""
|
||||||
|
desc = cursor.description
|
||||||
|
nt_result = namedtuple('Result', [col[0] for col in desc])
|
||||||
|
return [nt_result(*row) for row in cursor.fetchall()]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user