class Activity(models.Model): name = models.CharField(verbose_name=_("Activity type"), max_length=100) slug = models.SlugField(blank=True) organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name="activities") description = CleanHTMLField(verbose_name=_("Activity description"), default="") picture = models.ImageField( verbose_name=_("Image"), upload_to="activities/", blank=True, null=True, validators=[validate_image], ) history = HistoricalRecords() def save(self, *args, **kwargs): self.slug = slugify(self.name) return super().save(*args, **kwargs) def __str__(self): return self.name def get_absolute_url(self): return reverse("event:activity_detail", args=(self.pk, self.slug)) def next_events(self): return get_future_published_events(self.events)[0:3]
class Place(models.Model): name = models.CharField(max_length=100, verbose_name=_("Name")) organization = models.ForeignKey( Organization, on_delete=models.CASCADE, null=True, blank=True, related_name="places", ) description = CleanHTMLField( default="", verbose_name=_("Place description") ) category = models.CharField(max_length=100, default="Other") slug = models.SlugField(default="", blank=True) address = models.CharField( max_length=255, verbose_name=_("street address") ) longitude = models.FloatField() latitude = models.FloatField() picture = models.ImageField( upload_to="places/", blank=True, null=True, validators=[validate_image], verbose_name=_("Image"), ) is_visible = models.NullBooleanField( _("Lieu principal"), default=False, help_text=_( "Est-ce que ce lieu est un lieu de votre organisation ? Si vous cochez oui, il sera visible sur votre page" ), ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) history = HistoricalRecords() def save(self, *args, **kwargs): self.slug = slugify(self.name) return super().save(*args, **kwargs) def get_absolute_url(self): return reverse("location:detail", args=(self.pk, self.slug)) def future_published_events(self): return get_future_published_events(self.events) def __str__(self): return self.name
class CustomUser(AbstractBaseUser, PermissionsMixin): GENDER_MALE = "m" GENDER_FEMALE = "f" GENDER_OTHER = "n" GENDERS = ( (GENDER_MALE, _("Male")), (GENDER_FEMALE, _("Female")), (GENDER_OTHER, _("Other")), ) email = models.EmailField(_("email address"), max_length=254, unique=True) first_name = models.CharField(_("first name"), max_length=30, default="") last_name = models.CharField(_("last name"), max_length=30, default="") street_address = models.CharField(verbose_name=_("street address"), max_length=255, default="-") phone_number = models.CharField(_("phone number"), max_length=10, blank=True, default="-") birth_date = models.DateField(_("date of birth"), blank=True, null=True) gender = models.CharField(max_length=1, choices=GENDERS, blank=True, default=GENDER_OTHER) avatar_img = models.ImageField( verbose_name=_("Avatar"), upload_to="media/avatar/", null=True, blank=True, ) username = "" bio = CleanHTMLField(_("bio"), blank=True, default="") is_staff = models.BooleanField( _("staff status"), default=False, help_text=_( "Designates whether the user can log into this admin site."), ) is_active = models.BooleanField( _("active"), default=True, help_text=_("Designates whether this user should be treated as " "active. Unselect this instead of deleting accounts."), ) date_joined = models.DateTimeField(_("date joined"), default=timezone.now) is_visible = models.BooleanField( _("Profile visible"), default=False, help_text=_("Should people be able to see your profile?"), ) history = HistoricalRecords() objects = CustomUserManager() USERNAME_FIELD = "email" def get_organizations(self): return self.member_organizations.all().union( self.visitor_organizations.all(), self.active_organizations.all(), self.volunteer_organizations.all(), self.admin_organizations.all(), ) def get_absolute_url(self): return reverse("user:user_detail", kwargs={"pk": self.pk}) def __str__(self): if self.first_name: return f"{self.first_name} {self.last_name}" return self.email
class Organization(models.Model): name = models.CharField(max_length=100, default="", verbose_name=_("Organization name")) description = CleanHTMLField(verbose_name=_("Activity description"), default="") email = models.EmailField(max_length=200, verbose_name=_("Organization mail address"), blank=True) website = models.URLField(max_length=200, verbose_name=_("Organization website mail"), blank=True) phone_number = models.CharField(_("Organization phone number"), max_length=10, blank=True, default="-") picture = models.ImageField( verbose_name=_("Image"), upload_to="organizations/", validators=[validate_image], ) slug = models.SlugField(default="", unique=True) visitors = models.ManyToManyField(CustomUser, related_name="visitor_organizations", blank=True) members = models.ManyToManyField( CustomUser, related_name="member_organizations", blank=True, through="Membership", ) volunteers = models.ManyToManyField(CustomUser, related_name="volunteer_organizations", blank=True) actives = models.ManyToManyField(CustomUser, related_name="active_organizations", blank=True) admins = models.ManyToManyField(CustomUser, related_name="admin_organizations", blank=True) min_fee = models.PositiveIntegerField( verbose_name=_("Minimum contribution"), default=0, blank=True) advised_fee = models.PositiveIntegerField( verbose_name=_("Advised contribution"), default=0, blank=True) fee_description = models.TextField( verbose_name=_("Explain how the contribution system works"), default="", blank=True, ) history = HistoricalRecords() def save(self, *args, **kwargs): self.slug = slugify(self.name) return super().save(*args, **kwargs) def get_absolute_url(self): return reverse("organization_page", kwargs={"orga_slug": self.slug}) @property def actives_or_more(self): return self.actives.union(self.admins.all()) def __str__(self): return self.name
def test_html_field(): field = CleanHTMLField() with pytest.raises(ValidationError): field.clean("<script>alert(0)</script>", Place)