Skip to content

Commit

Permalink
Migrate drafting logic to use is_published instead
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-Jess committed Mar 24, 2024
1 parent c078671 commit 3f3ca47
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 5.0.2 on 2024-03-22 21:50

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("sublet", "0005_sublet_is_draft_alter_sublet_end_date_and_more"),
]

operations = [
migrations.RemoveField(model_name="sublet", name="is_draft",),
migrations.AddField(
model_name="sublet", name="is_published", field=models.BooleanField(default=False),
),
]
2 changes: 1 addition & 1 deletion backend/sublet/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Sublet(models.Model):
sublettees = models.ManyToManyField(
User, through=Offer, related_name="sublets_offered", blank=True
)
is_draft = models.BooleanField(default=True)
is_published = models.BooleanField(default=False)
favorites = models.ManyToManyField(User, related_name="sublets_favorited", blank=True)
amenities = models.ManyToManyField(Amenity, blank=True)

Expand Down
66 changes: 33 additions & 33 deletions backend/sublet/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,34 +61,30 @@ class SubletSerializer(serializers.ModelSerializer):
many=True, queryset=Amenity.objects.all(), required=False
)

def validate_not_draft(self, validated_data, instance=None):
if "is_draft" in validated_data and not validated_data["is_draft"]:
# check that certain fields are there
fields = [
"title",
"address",
"price",
"negotiable",
"start_date",
"end_date",
"expires_at",
]
if bad_fields := [
field
for field in fields
if (field in validated_data and not validated_data[field])
or (
field not in validated_data
and (
instance is None
or not hasattr(instance, field)
or not getattr(instance, field)
)
)
]:
raise serializers.ValidationError(
f"{', '.join(bad_fields)} are required to publish sublet."
)
def validate_publish(self, validated_data, instance=None):
fields = [
"title",
"address",
"price",
"negotiable",
"start_date",
"end_date",
"expires_at",
]

def field_bad(field, validated_data, instance):
if field in validated_data:
if not validated_data[field]:
return True
else:
if not instance or not hasattr(instance, field) or not getattr(instance, field):
return True
return False

if bad_fields := [field for field in fields if field_bad(field, validated_data, instance)]:
raise serializers.ValidationError(
f"{', '.join(bad_fields)} are required to publish sublet."
)

class Meta:
model = Sublet
Expand All @@ -101,7 +97,7 @@ class Meta:
]
fields = [
"id",
"is_draft",
"is_published",
"amenities",
"title",
"address",
Expand All @@ -122,7 +118,8 @@ class Meta:

def create(self, validated_data):
validated_data["subletter"] = self.context["request"].user
self.validate_not_draft(validated_data)
if validated_data["is_published"]:
self.validate_publish(validated_data)
instance = super().create(validated_data)
instance.save()
return instance
Expand All @@ -134,8 +131,10 @@ def update(self, instance, validated_data):
self.context["request"].user == instance.subletter
or self.context["request"].user.is_superuser
):
if instance.is_draft:
self.validate_not_draft(validated_data, instance)
if ("is_published" in validated_data and validated_data["is_published"]) or (
"is_published" not in validated_data and instance.is_published
):
self.validate_publish(validated_data, instance)
instance = super().update(instance, validated_data)
instance.save()
return instance
Expand Down Expand Up @@ -164,7 +163,7 @@ class Meta:
read_only_fields = ["id", "created_at", "subletter", "sublettees"]
fields = [
"id",
"subletter",
"is_published",
"amenities",
"title",
"address",
Expand Down Expand Up @@ -192,6 +191,7 @@ class Meta:
model = Sublet
fields = [
"id",
"is_published",
"subletter",
"amenities",
"title",
Expand Down
6 changes: 6 additions & 0 deletions backend/tests/sublet/test_sublets.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,11 @@ def test_create_sublet(self):
"start_date": "3000-04-09",
"end_date": "3000-08-07",
"amenities": ["Amenity1", "Amenity2"],
"is_published": True,
}
response = self.client.post("/sublet/properties/", payload)
res_json = json.loads(response.content)
print(res_json)
match_keys = [
"title",
"address",
Expand All @@ -65,6 +67,7 @@ def test_create_sublet(self):
"start_date",
"end_date",
"amenities",
"is_published",
]
[self.assertEqual(payload[key], res_json[key]) for key in match_keys]
self.assertIn("id", res_json)
Expand Down Expand Up @@ -99,6 +102,9 @@ def test_update_sublet(self):
self.assertEqual("New Title", Sublet.objects.get(id=old_id).title)
self.assertEqual("New Title", res_json["title"])
self.assertEqual(1, len(res_json["amenities"]))
payload["address"] = ""
payload["is_published"] = True
self.client.patch(f"/sublet/properties/{str(old_id)}/", payload)

def test_browse_sublets(self):
response = self.client.get("/sublet/properties/")
Expand Down

0 comments on commit 3f3ca47

Please sign in to comment.