diff --git a/companies/views.py b/companies/views.py index 84708c8d..b5852d05 100644 --- a/companies/views.py +++ b/companies/views.py @@ -206,7 +206,7 @@ class ManufacturerDetailView(SlugRedirectMixin, EditSubmissionMixin, PhotoSubmis def _handle_submission( - request: Any, form: Any, model: ModelType, success_url: str + request: Any, form: Any, model: ModelType, success_url: str = "" ) -> HttpResponseRedirect: """Helper method to handle form submissions""" cleaned_data = form.cleaned_data.copy() @@ -214,6 +214,7 @@ def _handle_submission( user=request.user, content_type=ContentType.objects.get_for_model(model), submission_type="CREATE", + status="NEW", changes=cleaned_data, reason=request.POST.get("reason", ""), source=request.POST.get("source", ""), @@ -229,6 +230,12 @@ def _handle_submission( submission.status = "APPROVED" submission.handled_by = request.user submission.save() + + # Generate success URL if not provided + if not success_url: + success_url = reverse( + f"companies:{model.__name__.lower()}_detail", kwargs={"slug": obj.slug} + ) messages.success(request, f'Successfully created {getattr(obj, "name", "")}') return HttpResponseRedirect(success_url) @@ -244,10 +251,7 @@ class CompanyCreateView(LoginRequiredMixin, CreateView): object: Optional[Company] def form_valid(self, form: CompanyForm) -> HttpResponseRedirect: - success_url = reverse( - "companies:company_detail", kwargs={"slug": form.instance.slug} - ) - return _handle_submission(self.request, form, self.model, success_url) + return _handle_submission(self.request, form, self.model, "") def get_success_url(self) -> str: if self.object is None: @@ -262,10 +266,7 @@ class ManufacturerCreateView(LoginRequiredMixin, CreateView): object: Optional[Manufacturer] def form_valid(self, form: ManufacturerForm) -> HttpResponseRedirect: - success_url = reverse( - "companies:manufacturer_detail", kwargs={"slug": form.instance.slug} - ) - return _handle_submission(self.request, form, self.model, success_url) + return _handle_submission(self.request, form, self.model, "") def get_success_url(self) -> str: if self.object is None: diff --git a/media/submissions/photos/test_0KnoSgG.gif b/media/submissions/photos/test_0KnoSgG.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_0KnoSgG.gif differ diff --git a/media/submissions/photos/test_3LucxDK.gif b/media/submissions/photos/test_3LucxDK.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_3LucxDK.gif differ diff --git a/media/submissions/photos/test_4TRPE6Y.gif b/media/submissions/photos/test_4TRPE6Y.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_4TRPE6Y.gif differ diff --git a/media/submissions/photos/test_5KD0KRW.gif b/media/submissions/photos/test_5KD0KRW.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_5KD0KRW.gif differ diff --git a/media/submissions/photos/test_66qSjsN.gif b/media/submissions/photos/test_66qSjsN.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_66qSjsN.gif differ diff --git a/media/submissions/photos/test_67QBAK0.gif b/media/submissions/photos/test_67QBAK0.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_67QBAK0.gif differ diff --git a/media/submissions/photos/test_DrkLE8K.gif b/media/submissions/photos/test_DrkLE8K.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_DrkLE8K.gif differ diff --git a/media/submissions/photos/test_IsnDmeY.gif b/media/submissions/photos/test_IsnDmeY.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_IsnDmeY.gif differ diff --git a/media/submissions/photos/test_LPkIUyk.gif b/media/submissions/photos/test_LPkIUyk.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_LPkIUyk.gif differ diff --git a/media/submissions/photos/test_Oha7RwK.gif b/media/submissions/photos/test_Oha7RwK.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_Oha7RwK.gif differ diff --git a/media/submissions/photos/test_RpGxPCG.gif b/media/submissions/photos/test_RpGxPCG.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_RpGxPCG.gif differ diff --git a/media/submissions/photos/test_S2JX5Nx.gif b/media/submissions/photos/test_S2JX5Nx.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_S2JX5Nx.gif differ diff --git a/media/submissions/photos/test_TLfYnGO.gif b/media/submissions/photos/test_TLfYnGO.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_TLfYnGO.gif differ diff --git a/media/submissions/photos/test_U37Ca0y.gif b/media/submissions/photos/test_U37Ca0y.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_U37Ca0y.gif differ diff --git a/media/submissions/photos/test_UBDlVqD.gif b/media/submissions/photos/test_UBDlVqD.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_UBDlVqD.gif differ diff --git a/media/submissions/photos/test_aOIN0P5.gif b/media/submissions/photos/test_aOIN0P5.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_aOIN0P5.gif differ diff --git a/media/submissions/photos/test_dUweQ8o.gif b/media/submissions/photos/test_dUweQ8o.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_dUweQ8o.gif differ diff --git a/media/submissions/photos/test_ez4Nn2l.gif b/media/submissions/photos/test_ez4Nn2l.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_ez4Nn2l.gif differ diff --git a/media/submissions/photos/test_gsmEklC.gif b/media/submissions/photos/test_gsmEklC.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_gsmEklC.gif differ diff --git a/media/submissions/photos/test_ilc2eam.gif b/media/submissions/photos/test_ilc2eam.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_ilc2eam.gif differ diff --git a/media/submissions/photos/test_m5s47vB.gif b/media/submissions/photos/test_m5s47vB.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_m5s47vB.gif differ diff --git a/media/submissions/photos/test_mklzbsE.gif b/media/submissions/photos/test_mklzbsE.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_mklzbsE.gif differ diff --git a/media/submissions/photos/test_oijLFZj.gif b/media/submissions/photos/test_oijLFZj.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_oijLFZj.gif differ diff --git a/media/submissions/photos/test_ubzj2io.gif b/media/submissions/photos/test_ubzj2io.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_ubzj2io.gif differ diff --git a/media/submissions/photos/test_wHX7LMT.gif b/media/submissions/photos/test_wHX7LMT.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_wHX7LMT.gif differ diff --git a/media/submissions/photos/test_x2OOj5F.gif b/media/submissions/photos/test_x2OOj5F.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_x2OOj5F.gif differ diff --git a/media/submissions/photos/test_zxg9z0k.gif b/media/submissions/photos/test_zxg9z0k.gif new file mode 100644 index 00000000..0ad774e8 Binary files /dev/null and b/media/submissions/photos/test_zxg9z0k.gif differ diff --git a/moderation/models.py b/moderation/models.py index 00dc5e33..e8f3192a 100644 --- a/moderation/models.py +++ b/moderation/models.py @@ -277,6 +277,16 @@ class PhotoSubmission(models.Model): self.handled_at = timezone.now() self.notes = notes self.save() + + def auto_approve(self) -> None: + """Auto-approve submissions from moderators""" + # Get user role safely + user_role = getattr(self.user, "role", None) + + # If user is moderator or above, auto-approve + if user_role in ["MODERATOR", "ADMIN", "SUPERUSER"]: + self.approve(self.user) + def escalate(self, moderator: UserType, notes: str = "") -> None: """Escalate the photo submission to admin""" diff --git a/requirements.txt b/requirements.txt index 491aaedd..99481711 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,6 +24,7 @@ django-webpack-loader==3.1.1 python-dotenv==1.0.1 Pillow==11.1.0 # For image handling django-cleanup==9.0.0 # Automatically delete files +piexif==1.1.3 # For image EXIF metadata handling django-filter==24.3 django-htmx==1.21.0 whitenoise==6.8.2 # Static file serving