decimal_places=2, max_digits=7, null=True)), 37
+                ('unit_name', models.CharField(max_length=200, null=True)),
38
+                ('created_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='productsku_created', to=settings.AUTH_USER_MODEL)),
39
+                ('modified_by', models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='productsku_modified', to=settings.AUTH_USER_MODEL)),
40
+                ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='fruit.product')),
41
+            ],
42
+            options={
43
+                'abstract': False,
44
+            },
45
+        ),
46
+    ]

+ 19 - 0
app/fruit/migrations/0008_product_code.py

@@ -0,0 +1,19 @@
1
+# Generated by Django 3.2.5 on 2021-07-27 16:18
2
+
3
+from django.db import migrations, models
4
+
5
+
6
+class Migration(migrations.Migration):
7
+
8
+    dependencies = [
9
+        ('fruit', '0007_auto_20210727_2312'),
10
+    ]
11
+
12
+    operations = [
13
+        migrations.AddField(
14
+            model_name='product',
15
+            name='code',
16
+            field=models.CharField(default='', max_length=200),
17
+            preserve_default=False,
18
+        ),
19
+    ]

+ 0 - 0
app/fruit/migrations/__init__.py


+ 133 - 0
app/fruit/models.py

@@ -0,0 +1,133 @@
1
+from django.db import models
2
+
3
+from django_google_maps import fields as map_fields
4
+from colorfield.fields import ColorField
5
+from smart_selects.db_fields import (
6
+    ChainedForeignKey,
7
+    ChainedManyToManyField,
8
+    GroupedForeignKey,
9
+)
10
+from django.db.models import Q
11
+import googlemaps
12
+from django.contrib.gis.geos import fromstr
13
+
14
+from django.conf import settings
15
+import csv
16
+import haversine as hs
17
+from mptt.models import MPTTModel, TreeForeignKey
18
+
19
+from django.contrib.auth.models import User
20
+from django.db.models.signals import post_save
21
+from django.dispatch import receiver
22
+from shaqfindbed.utils import get_current_user
23
+
24
+
25
+# Create your models here.
26
+
27
+class GenericModel(models.Model):
28
+    created_at = models.DateTimeField(auto_now_add=True, null=True)
29
+    updated_at = models.DateTimeField(auto_now=True)
30
+
31
+    created_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_created', on_delete=models.SET_NULL)
32
+    modified_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_modified', on_delete=models.SET_NULL)
33
+
34
+    '''
35
+    def save(self, *args, **kwargs):
36
+        user = get_current_user()
37
+        print("user "+user.is_authenticated())
38
+        if user and user.is_authenticated():
39
+            self.modified_by = user
40
+            if not self.id:
41
+                self.created_by = user
42
+        super(GenericModel, self).save(*args, **kwargs)
43
+    '''
44
+
45
+    class Meta:
46
+        abstract = True
47
+
48
+class Store(models.Model):
49
+    name = models.CharField(max_length=200)
50
+    address_text = models.TextField(blank=True, null=True)
51
+    #address = models.CharField(max_length=100)
52
+    address = map_fields.AddressField(max_length=200)
53
+    geolocation = map_fields.GeoLocationField(max_length=100)
54
+
55
+
56
+    tel = models.CharField(max_length=100, null=True, blank=True)
57
+    line_id = models.CharField(max_length=100, null=True, blank=True)
58
+    email = models.EmailField(null=True, blank=True)
59
+
60
+
61
+    created_at = models.DateTimeField(auto_now_add=True, null=True)
62
+    updated_at = models.DateTimeField(auto_now=True)
63
+
64
+    def __str__(self):
65
+        return f"{self.name}"
66
+
67
+
68
+
69
+class ProductType(MPTTModel):
70
+    name = models.CharField(max_length=50, unique=True)
71
+    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
72
+
73
+    class MPTTMeta:
74
+        order_insertion_by = ['name']
75
+
76
+
77
+    def __str__(self):
78
+        return f"{self.name}"
79
+
80
+
81
+class Product(GenericModel, models.Model ):
82
+    name = models.CharField(max_length=200)
83
+    code = models.CharField(max_length=200)
84
+    product_type = models.ForeignKey('ProductType', on_delete=models.SET_NULL, null=True)
85
+    description = models.TextField(blank=True, null=True)
86
+    store = models.ForeignKey('Store', on_delete=models.CASCADE, null=True, blank=False)
87
+    price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
88
+
89
+    details  = models.JSONField(null=True, blank=True)
90
+
91
+    n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
92
+    unit_name = models.CharField(max_length=200, null=True)
93
+
94
+    def __str__(self):
95
+        return f"{self.name} {self.code}"
96
+
97
+class ProductSKU(GenericModel, models.Model ):
98
+    sku = models.CharField(max_length=200)
99
+    product  = models.ForeignKey('Product', on_delete=models.CASCADE, null=True)
100
+    description = models.TextField(blank=True, null=True)
101
+    price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
102
+
103
+    details  = models.JSONField(null=True, blank=True)
104
+
105
+    n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
106
+    unit_name = models.CharField(max_length=200, null=True)
107
+
108
+class Photo(GenericModel, models.Model):
109
+    name = models.CharField(max_length=200, unique=True)
110
+    photo  = models.ImageField(upload_to="uploads/%Y/%m/%d/", blank=True, verbose_name="Photo")
111
+    product = models.ForeignKey('Product', on_delete=models.CASCADE, null=True)
112
+
113
+
114
+
115
+
116
+
117
+class Profile(models.Model):
118
+    user = models.OneToOneField(User, on_delete=models.CASCADE)
119
+    bio = models.TextField(max_length=500, blank=True)
120
+    location = models.CharField(max_length=30, blank=True)
121
+    birth_date = models.DateField(null=True, blank=True)
122
+
123
+@receiver(post_save, sender=User)
124
+def create_user_profile(sender, instance, created, **kwargs):
125
+    if created:
126
+        Profile.objects.create(user=instance)
127
+
128
+@receiver(post_save, sender=User)
129
+def save_user_profile(sender, instance, **kwargs):
130
+    try:
131
+        instance.profile.save()
132
+    except:
133
+        Profile.objects.create(user=instance)

+ 0 - 0
app/fruit/templates/fruit/index.html


+ 5 - 0
app/fruit/templates/fruit/mystore.html

@@ -0,0 +1,5 @@
1
+{% extends "front/base.html" %}
2
+{% load static %}
3
+{% block content %}
4
+<h1>My Store</h1>
5
+{% endblock %}

+ 21 - 0
app/fruit/templates/fruit/signup.html

@@ -0,0 +1,21 @@
1
+{% extends "front/base.html" %}
2
+{% load static %}
3
+{% block content %}
4
+  <h2>Sign up</h2>
5
+  <form method="post">
6
+    {% csrf_token %}
7
+    {% for field in form %}
8
+      <p>
9
+        {{ field.label_tag }}<br>
10
+        {{ field }}
11
+        {% if field.help_text %}
12
+          <small style="color: grey">{{ field.help_text }}</small>
13
+        {% endif %}
14
+        {% for error in field.errors %}
15
+          <p style="color: red">{{ error }}</p>
16
+        {% endfor %}
17
+      </p>
18
+    {% endfor %}
19
+    <button type="submit">Sign up</button>
20
+  </form>
21
+{% endblock %}

+ 3 - 0
app/fruit/tests.py

@@ -0,0 +1,3 @@
1
+from django.test import TestCase
2
+
3
+# Create your tests here.

+ 12 - 0
app/fruit/urls.py

@@ -0,0 +1,12 @@
1
+
2
+from django.urls import path
3
+from django.conf.urls import url
4
+from . import views
5
+
6
+urlpatterns = [
7
+    path('', views.index, name='index'),
8
+    path('mystore', views.mystore, name='mystore'),
9
+    path('signup', views.signup, name='signup'),
10
+]
11
+
12
+app_name = 'fruit'

+ 28 - 0
app/fruit/views.py

@@ -0,0 +1,28 @@
1
+#from django.shortcuts import render
2
+from django.shortcuts import render, redirect
3
+# Create your views here.
4
+from django.contrib.auth import login, authenticate
5
+from django.contrib.auth.forms import UserCreationForm
6
+from django.urls import reverse
7
+from django.contrib.auth.decorators import login_required
8
+
9
+def index(request):
10
+    return render(request, 'fruit/index.html')
11
+
12
+@login_required
13
+def mystore(request):
14
+    return render(request, 'fruit/mystore.html')
15
+
16
+def signup(request):
17
+    if request.method == 'POST':
18
+        form = UserCreationForm(request.POST)
19
+        if form.is_valid():
20
+            form.save()
21
+            username = form.cleaned_data.get('username')
22
+            raw_password = form.cleaned_data.get('password1')
23
+            user = authenticate(username=username, password=raw_password)
24
+            login(request, user)
25
+            return redirect('front:index')
26
+    else:
27
+        form = UserCreationForm()
28
+    return render(request, 'fruit/signup.html', {'form': form})

+ 0 - 0
app/requirements.txt


Some files were not shown because too many files changed in this diff

tum/recycle_server - Gogs: Simplico Git Service

Nessuna descrizione