Initial Commit
This commit is contained in:
0
field/__init__.py
Normal file
0
field/__init__.py
Normal file
13
field/admin.py
Normal file
13
field/admin.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
from .models import Cost, Cultivation_calender, Field, Image, Job, Note, Product, Voice
|
||||
|
||||
admin.site.register(Cost)
|
||||
admin.site.register(Cultivation_calender)
|
||||
admin.site.register(Field)
|
||||
admin.site.register(Image)
|
||||
admin.site.register(Job)
|
||||
admin.site.register(Note)
|
||||
admin.site.register(Product)
|
||||
admin.site.register(Voice)
|
||||
6
field/apps.py
Normal file
6
field/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class FieldConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'field'
|
||||
83
field/migrations/0001_initial.py
Normal file
83
field/migrations/0001_initial.py
Normal file
@@ -0,0 +1,83 @@
|
||||
# Generated by Django 5.2.4 on 2025-07-29 17:23
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Cost',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Cultivation_calender',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('calender', models.JSONField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Field',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('geography', models.JSONField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Image',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('image', models.ImageField(upload_to='images/')),
|
||||
('uploaded_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Note',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('content', models.TextField()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Voice',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('Voice', models.FileField(upload_to='audios/')),
|
||||
('uploaded_at', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='product',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('cultivation_days', models.IntegerField()),
|
||||
('cultivation_calender', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='field.cultivation_calender')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Job',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('made_date', models.DateTimeField(auto_now_add=True)),
|
||||
('due_date', models.DateTimeField()),
|
||||
('status', models.BooleanField()),
|
||||
('costs', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='field.cost')),
|
||||
('field', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='field.field')),
|
||||
('images', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='field.image')),
|
||||
('notes', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='field.note')),
|
||||
('voices', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='field.voice')),
|
||||
],
|
||||
),
|
||||
]
|
||||
18
field/migrations/0002_cost_amount.py
Normal file
18
field/migrations/0002_cost_amount.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.4 on 2025-07-29 17:33
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('field', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='cost',
|
||||
name='amount',
|
||||
field=models.BigIntegerField(default=0),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 5.2.4 on 2025-07-29 17:41
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('field', '0002_cost_amount'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='image',
|
||||
name='comment',
|
||||
field=models.TextField(default=''),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cultivation_calender',
|
||||
name='calender',
|
||||
field=models.JSONField(default=dict),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='field',
|
||||
name='geography',
|
||||
field=models.JSONField(default=dict),
|
||||
),
|
||||
]
|
||||
18
field/migrations/0004_job_type.py
Normal file
18
field/migrations/0004_job_type.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.2.4 on 2025-07-29 17:55
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('field', '0003_image_comment_alter_cultivation_calender_calender_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='job',
|
||||
name='type',
|
||||
field=models.CharField(choices=[('Irrigating', 'IRRIGATING'), ('Planting', 'PLANTING'), ('PrePlanting', 'PREPLANTING'), ('Fertilizing', 'FERTILIZING'), ('Pruning', 'PRUNING'), ('Harvesting', 'HARVESTING')], default='Irrigating', max_length=15),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,43 @@
|
||||
# Generated by Django 5.2.4 on 2025-07-29 18:30
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('field', '0004_job_type'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='voice',
|
||||
name='Voice',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='job',
|
||||
name='costs',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='field.cost'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='job',
|
||||
name='images',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='field.image'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='job',
|
||||
name='notes',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='field.note'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='job',
|
||||
name='voices',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='field.voice'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='voice',
|
||||
name='voice',
|
||||
field=models.FileField(blank=True, null=True, upload_to='audios/'),
|
||||
),
|
||||
]
|
||||
0
field/migrations/__init__.py
Normal file
0
field/migrations/__init__.py
Normal file
83
field/models.py
Normal file
83
field/models.py
Normal file
@@ -0,0 +1,83 @@
|
||||
from django.db import models
|
||||
|
||||
|
||||
# Create your models here.
|
||||
class Field(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
geography = models.JSONField(default=dict)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Note(models.Model):
|
||||
content = models.TextField()
|
||||
|
||||
def __str__(self):
|
||||
return self.content[:60]
|
||||
|
||||
|
||||
class Cost(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
amount = models.BigIntegerField(default=0)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Image(models.Model):
|
||||
image = models.ImageField(upload_to="images/")
|
||||
comment = models.TextField(default="")
|
||||
uploaded_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.image.name
|
||||
|
||||
|
||||
class Voice(models.Model):
|
||||
voice = models.FileField(upload_to="audios/", null=True, blank=True)
|
||||
uploaded_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
if self.voice.name:
|
||||
return self.voice.name
|
||||
else:
|
||||
return "null"
|
||||
|
||||
|
||||
class Job(models.Model):
|
||||
TYPE_CHOICES = [
|
||||
("Irrigating", "IRRIGATING"),
|
||||
("Planting", "PLANTING"),
|
||||
("PrePlanting", "PREPLANTING"),
|
||||
("Fertilizing", "FERTILIZING"),
|
||||
("Pruning", "PRUNING"),
|
||||
("Harvesting", "HARVESTING"),
|
||||
]
|
||||
type = models.CharField(max_length=15, choices=TYPE_CHOICES, default="Irrigating")
|
||||
field = models.ForeignKey(Field, on_delete=models.CASCADE)
|
||||
made_date = models.DateTimeField(auto_now_add=True)
|
||||
due_date = models.DateTimeField()
|
||||
status = models.BooleanField()
|
||||
costs = models.ForeignKey(Cost, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
notes = models.ForeignKey(Note, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
voices = models.ForeignKey(Voice, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
images = models.ForeignKey(Image, on_delete=models.SET_NULL, null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.type
|
||||
|
||||
|
||||
class Cultivation_calender(models.Model):
|
||||
calender = models.JSONField(default=dict)
|
||||
|
||||
|
||||
class Product(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
cultivation_days = models.IntegerField()
|
||||
cultivation_calender = models.OneToOneField(
|
||||
Cultivation_calender, on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
58
field/serializers.py
Normal file
58
field/serializers.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Field, Note, Cost, Image, Voice, Job, Cultivation_calender, Product
|
||||
|
||||
|
||||
class FieldSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Field
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class NoteSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Note
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CostSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Cost
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class ImageSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Image
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class VoiceSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Voice
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class JobSerializer(serializers.ModelSerializer):
|
||||
field = FieldSerializer()
|
||||
costs = CostSerializer()
|
||||
notes = NoteSerializer()
|
||||
voices = VoiceSerializer()
|
||||
images = ImageSerializer()
|
||||
|
||||
class Meta:
|
||||
model = Job
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CultivationCalenderSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Cultivation_calender
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class ProductSerializer(serializers.ModelSerializer):
|
||||
cultivation_calender = CultivationCalenderSerializer()
|
||||
|
||||
class Meta:
|
||||
model = Product
|
||||
fields = "__all__"
|
||||
3
field/tests.py
Normal file
3
field/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
6
field/urls.py
Normal file
6
field/urls.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.urls import path
|
||||
from .views import JobListView
|
||||
|
||||
urlpatterns = [
|
||||
path("jobs/v1/", JobListView.as_view()),
|
||||
]
|
||||
15
field/views.py
Normal file
15
field/views.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from django.shortcuts import render
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from .models import Job
|
||||
from .serializers import JobSerializer
|
||||
from rest_framework.viewsets import ModelViewSet
|
||||
|
||||
# Create your views here.
|
||||
|
||||
|
||||
class JobListView(APIView):
|
||||
def get(self, request):
|
||||
jobs = Job.objects.all()
|
||||
serilizer = JobSerializer(jobs, many=True)
|
||||
return Response(serilizer.data)
|
||||
Reference in New Issue
Block a user