diff --git a/field/migrations/0003_cost_date.py b/field/migrations/0003_cost_date.py new file mode 100644 index 0000000..681bf10 --- /dev/null +++ b/field/migrations/0003_cost_date.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.4 on 2025-08-07 10:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('field', '0002_alter_job_due_date'), + ] + + operations = [ + migrations.AddField( + model_name='cost', + name='date', + field=models.DateTimeField(blank=True, null=True), + ), + ] diff --git a/field/migrations/0004_rename_due_date_job_date.py b/field/migrations/0004_rename_due_date_job_date.py new file mode 100644 index 0000000..08d0e39 --- /dev/null +++ b/field/migrations/0004_rename_due_date_job_date.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.4 on 2025-08-07 11:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('field', '0003_cost_date'), + ] + + operations = [ + migrations.RenameField( + model_name='job', + old_name='due_date', + new_name='date', + ), + ] diff --git a/field/migrations/0005_remove_job_costs_remove_job_images_remove_job_notes_and_more.py b/field/migrations/0005_remove_job_costs_remove_job_images_remove_job_notes_and_more.py new file mode 100644 index 0000000..e5d7313 --- /dev/null +++ b/field/migrations/0005_remove_job_costs_remove_job_images_remove_job_notes_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 5.2.4 on 2025-08-08 10:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('field', '0004_rename_due_date_job_date'), + ] + + operations = [ + migrations.RemoveField( + model_name='job', + name='costs', + ), + migrations.RemoveField( + model_name='job', + name='images', + ), + migrations.RemoveField( + model_name='job', + name='notes', + ), + migrations.AddField( + model_name='job', + name='costs', + field=models.ManyToManyField(blank=True, null=True, to='field.cost'), + ), + migrations.AddField( + model_name='job', + name='images', + field=models.ManyToManyField(blank=True, null=True, to='field.image'), + ), + migrations.AddField( + model_name='job', + name='notes', + field=models.ManyToManyField(blank=True, null=True, to='field.note'), + ), + ] diff --git a/field/models.py b/field/models.py index 0e76ce8..aee9c55 100644 --- a/field/models.py +++ b/field/models.py @@ -26,6 +26,7 @@ class Cost(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True) name = models.CharField(max_length=255) amount = models.BigIntegerField(default=0) + date = models.DateTimeField(null=True, blank=True) def __str__(self): return self.name @@ -71,13 +72,13 @@ class Job(models.Model): 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.DateField() + date = models.DateField() 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) + costs = models.ManyToManyField(Cost, null=True, blank=True) + notes = models.ManyToManyField(Note, null=True, blank=True) ##########REMOVE THIS MF! # 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) + images = models.ManyToManyField(Image, null=True, blank=True) def __str__(self): return self.type diff --git a/field/serializers.py b/field/serializers.py index 4670574..38c821b 100644 --- a/field/serializers.py +++ b/field/serializers.py @@ -23,6 +23,7 @@ class CostSerializer(serializers.ModelSerializer): class ImageSerializer(serializers.ModelSerializer): + image = serializers.ImageField(use_url=True) uploaded_at = serializers.SerializerMethodField() class Meta: @@ -39,15 +40,15 @@ class JobSerializer(serializers.ModelSerializer): # costs = serializers.PrimaryKeyRelatedField( # queryset=Cost.objects.all(), required=False, allow_null=True # ) - costs = CostSerializer(read_only=True, allow_null=True) + costs = CostSerializer(read_only=True, many=True) # notes = serializers.PrimaryKeyRelatedField( - # queryset=Note.objects.all(), required=False, allow_null=True + # queryset=Note.objects.all(), required=False, many=True # ) - notes = NoteSerializer(read_only=True, allow_null=True) + notes = NoteSerializer(read_only=True, many=True) # images = serializers.PrimaryKeyRelatedField( - # queryset=Image.objects.all(), required=False, allow_null=True + # queryset=Image.objects.all(), required=False, many=True # ) - images = ImageSerializer(read_only=True, allow_null=True) + images = ImageSerializer(read_only=True, many=True) class Meta: model = Job diff --git a/field/urls.py b/field/urls.py index 1dca493..2bb67eb 100644 --- a/field/urls.py +++ b/field/urls.py @@ -14,6 +14,8 @@ from .views import ( ProductListCreate, ProductDetail, ) +from django.conf import settings +from django.conf.urls.static import static def register_crud_urls(prefix, list_view, detail_view): @@ -32,7 +34,7 @@ urlpatterns += register_crud_urls("images", ImageListCreate, ImageDetail) urlpatterns += register_crud_urls("costs", CostListCreate, CostDetail) urlpatterns += register_crud_urls("fields", FieldListCreate, FieldDetail) urlpatterns += register_crud_urls("products", ProductListCreate, ProductDetail) - +urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # urlpatterns = [ # path("jobs/", JobListCreate.as_view(), name="job-createlist"), diff --git a/images/بستن_حسابها.png b/images/بستن_حسابها.png new file mode 100644 index 0000000..94fd6e7 Binary files /dev/null and b/images/بستن_حسابها.png differ diff --git a/images/رسیدگی_مالیاتی.png b/images/رسیدگی_مالیاتی.png new file mode 100644 index 0000000..501e2fe Binary files /dev/null and b/images/رسیدگی_مالیاتی.png differ diff --git a/media/images/مالیات_سرمایه_گذاری.png b/media/images/مالیات_سرمایه_گذاری.png new file mode 100644 index 0000000..c851df4 Binary files /dev/null and b/media/images/مالیات_سرمایه_گذاری.png differ diff --git a/media/images/مالیات_پزشکان.png b/media/images/مالیات_پزشکان.png new file mode 100644 index 0000000..ffc9337 Binary files /dev/null and b/media/images/مالیات_پزشکان.png differ diff --git a/settings/settings.py b/settings/settings.py index ca871d1..93f2fc2 100644 --- a/settings/settings.py +++ b/settings/settings.py @@ -143,6 +143,8 @@ USE_I18N = True USE_TZ = True +MEDIA_URL = "/media/" +MEDIA_ROOT = BASE_DIR / "media" # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/