structure du projet + docker, back: mise en place BD et apps, front: début de dev pour le header et mise en place du thème et css global (override des variables bootstrap)

This commit is contained in:
2026-06-01 15:21:47 +02:00
parent b3c027794c
commit e8e6122a45
111 changed files with 6778 additions and 1 deletions
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+5
View File
@@ -0,0 +1,5 @@
from django.apps import AppConfig
class A1LeadExplorerConfig(AppConfig):
name = 'api.lead_explorer'
@@ -0,0 +1,41 @@
# Generated by Django 6.0.5 on 2026-05-28 15:03
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='BrutCompany',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='créé le')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='modifié le')),
('obsolete', models.BooleanField(default=False, verbose_name='obsolète')),
('obsolete_at', models.DateTimeField(blank=True, null=True, verbose_name='obsolète le')),
('first_name', models.CharField(blank=True, max_length=100, verbose_name='prénom')),
('last_name', models.CharField(blank=True, max_length=100, verbose_name='nom')),
('company_name', models.CharField(blank=True, max_length=200, verbose_name='nom de société')),
('entity_type', models.CharField(choices=[('COMPANY', 'Société'), ('PERSON', 'Personne')], help_text="Si c'est une personne, le ContactPerson est automatiquement créé lorsque la société passe en prospection", max_length=20, verbose_name='type')),
('lat', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True, verbose_name='latitude')),
('long', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True, verbose_name='longitude')),
('address', models.CharField(blank=True, max_length=150, verbose_name='adresse')),
('postal_code', models.CharField(blank=True, max_length=20, verbose_name='code postal')),
('city', models.CharField(blank=True, max_length=30, verbose_name='ville')),
('siren', models.CharField(blank=True, max_length=9, verbose_name='numéro siren')),
('siret', models.CharField(blank=True, max_length=14, verbose_name='numéro siret')),
('processed', models.BooleanField(default=False, verbose_name='traité')),
('processed_at', models.DateTimeField(blank=True, null=True, verbose_name='traité le')),
],
options={
'verbose_name': 'Entreprise',
'verbose_name_plural': 'Entreprises',
},
),
]
@@ -0,0 +1,33 @@
# Generated by Django 6.0.5 on 2026-05-28 15:03
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('lead_explorer', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='brutcompany',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='créé par'),
),
migrations.AddField(
model_name='brutcompany',
name='processed_by',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='processed_companies', to=settings.AUTH_USER_MODEL, verbose_name='traité par'),
),
migrations.AddField(
model_name='brutcompany',
name='updated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='modifié par'),
),
]
@@ -0,0 +1,5 @@
from .brut_company import BrutCompany
__all__ = [
'BrutCompany',
]
@@ -0,0 +1,65 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
from api.core.models.trackable_model import TrackableModel
class BrutCompany(TrackableModel):
"""
Model representing the brut information from a company.
"""
ENTITY_TYPE = [
("COMPANY", _("Société")),
("PERSON", _("Personne")),
]
first_name = models.CharField(verbose_name=_("prénom"), max_length=100, blank=True)
last_name = models.CharField(verbose_name=_("nom"), max_length=100, blank=True)
company_name = models.CharField(
verbose_name=_("nom de société"), max_length=200, blank=True
) # unique=True ?
entity_type = models.CharField(
verbose_name=_("type"),
max_length=20,
choices=ENTITY_TYPE,
help_text=_(
"Si c'est une personne, le ContactPerson est automatiquement créé lorsque la société passe en prospection"
),
)
lat = models.DecimalField(
verbose_name=_("latitude"),
max_digits=9,
decimal_places=6,
blank=True,
null=True,
)
long = models.DecimalField(
verbose_name=_("longitude"),
max_digits=9,
decimal_places=6,
blank=True,
null=True,
)
address = models.CharField(verbose_name=_("adresse"), max_length=150, blank=True)
postal_code = models.CharField(
verbose_name=_("code postal"), max_length=20, blank=True
)
city = models.CharField(verbose_name=_("ville"), max_length=30, blank=True)
siren = models.CharField(verbose_name=_("numéro siren"), max_length=9, blank=True)
siret = models.CharField(verbose_name=_("numéro siret"), max_length=14, blank=True)
processed = models.BooleanField(verbose_name=_("traité"), default=False)
processed_at = models.DateTimeField(
verbose_name=_("traité le"), blank=True, null=True
)
processed_by = models.ForeignKey(
"users.User",
verbose_name=_("traité par"),
null=True,
on_delete=models.SET_NULL,
related_name="processed_companies",
)
class Meta:
verbose_name = _("Entreprise")
verbose_name_plural = _("Entreprises")
+5
View File
@@ -0,0 +1,5 @@
from django.urls import path
app_name = "lead_explorer"
urlpatterns = [
]
+2
View File
@@ -0,0 +1,2 @@
from django.shortcuts import render
from django.utils.translation import gettext_lazy as _