79 lines
2.9 KiB
Python
79 lines
2.9 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
|
|
|
|
class JobSource(models.Model):
|
|
class Family(models.TextChoices):
|
|
PORTAL = "portal", "National portal"
|
|
AGENCY = "agency", "Interim agency"
|
|
COMPANY = "company", "Company careers"
|
|
|
|
class Status(models.TextChoices):
|
|
PLANNED = "planned", "Planned"
|
|
ACTIVE = "active", "Active"
|
|
PAUSED = "paused", "Paused"
|
|
ERROR = "error", "Needs attention"
|
|
|
|
name = models.CharField(max_length=160)
|
|
family = models.CharField(max_length=24, choices=Family.choices)
|
|
url = models.URLField(unique=True)
|
|
status = models.CharField(max_length=24, choices=Status.choices, default=Status.PLANNED)
|
|
owner = models.CharField(max_length=120, blank=True)
|
|
notes = models.TextField(blank=True)
|
|
last_checked_at = models.DateTimeField(null=True, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
ordering = ["family", "name"]
|
|
indexes = [
|
|
models.Index(fields=["family", "status"]),
|
|
models.Index(fields=["name"]),
|
|
]
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("source_success", args=[self.pk])
|
|
|
|
|
|
class JobPosting(models.Model):
|
|
class ContractType(models.TextChoices):
|
|
CDI = "cdi", "CDI"
|
|
CDD = "cdd", "CDD"
|
|
INTERIM = "interim", "Interim"
|
|
APPRENTICESHIP = "apprenticeship", "Apprenticeship"
|
|
FREELANCE = "freelance", "Freelance"
|
|
OTHER = "other", "Other"
|
|
|
|
source = models.ForeignKey(JobSource, on_delete=models.PROTECT, related_name="jobs")
|
|
title = models.CharField(max_length=220)
|
|
company = models.CharField(max_length=180)
|
|
location = models.CharField(max_length=160, default="Dijon, Bourgogne-Franche-Comté")
|
|
contract_type = models.CharField(max_length=24, choices=ContractType.choices, default=ContractType.CDI)
|
|
remote = models.BooleanField(default=False)
|
|
salary = models.CharField(max_length=120, blank=True)
|
|
apply_url = models.URLField(blank=True)
|
|
published_at = models.DateField(default=timezone.localdate)
|
|
description = models.TextField()
|
|
is_active = models.BooleanField(default=True)
|
|
duplicate_score = models.DecimalField(max_digits=5, decimal_places=2, default=0)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
ordering = ["-published_at", "-created_at"]
|
|
indexes = [
|
|
models.Index(fields=["is_active", "published_at"]),
|
|
models.Index(fields=["company", "title"]),
|
|
models.Index(fields=["contract_type"]),
|
|
]
|
|
|
|
def __str__(self):
|
|
return f"{self.title} — {self.company}"
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("job_detail", args=[self.pk])
|