diff --git a/catalog/common/jsondata.py b/catalog/common/jsondata.py index 0a8dbaba..bbffb5e1 100644 --- a/catalog/common/jsondata.py +++ b/catalog/common/jsondata.py @@ -162,7 +162,7 @@ class DateField(JSONFieldMixin, fields.DateField): if value: if not isinstance(value, (datetime, date)): value = dateparse.parse_date(value) - return value.strftime("%Y-%m-%d") + return value.strftime("%Y-%m-%d") if value else None def from_json(self, value): if value is not None: diff --git a/catalog/views.py b/catalog/views.py index 32a36d0b..0a7914ad 100644 --- a/catalog/views.py +++ b/catalog/views.py @@ -41,7 +41,10 @@ def retrieve_by_uuid(request, item_uid): def retrieve(request, item_path, item_uuid): if request.method == "GET": - item = get_object_or_404(Item, uid=base62.decode(item_uuid)) + # item = get_object_or_404(Item, uid=base62.decode(item_uuid)) + item = Item.get_by_url(item_uuid) + if item is None: + return HttpResponseNotFound() item_url = f"/{item_path}/{item_uuid}" if item.url != item_url: return redirect(item.url) diff --git a/journal/models.py b/journal/models.py index 07be7f66..4f938e9a 100644 --- a/journal/models.py +++ b/journal/models.py @@ -117,6 +117,19 @@ class Piece(PolymorphicModel, UserOwnedObjectMixin): def api_url(self): return f"/api/{self.url}" if self.url_path else None + @classmethod + def get_by_url(cls, url_or_b62): + b62 = url_or_b62.strip().split("/")[-1] + if len(b62) not in [21, 22]: + r = re.search(r"[A-Za-z0-9]{21,22}", url_or_b62) + if r: + b62 = r[0] + try: + obj = cls.objects.get(uid=uuid.UUID(int=base62.decode(b62))) + except: + obj = None + return obj + class Content(Piece): owner = models.ForeignKey(User, on_delete=models.PROTECT) diff --git a/journal/views.py b/journal/views.py index 71fd41c0..d81de00f 100644 --- a/journal/views.py +++ b/journal/views.py @@ -480,7 +480,10 @@ def collection_edit(request, collection_uuid=None): def review_retrieve(request, review_uuid): - piece = get_object_or_404(Review, uid=base62.decode(review_uuid)) + # piece = get_object_or_404(Review, uid=base62.decode(review_uuid)) + piece = Review.get_by_url(review_uuid) + if piece is None: + return HttpResponseNotFound() if not piece.is_visible_to(request.user): raise PermissionDenied() return render(request, "review.html", {"review": piece})