Compare commits
68 Commits
9c457b17f5
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
448ab1f2e7 | ||
| 4c1f5951b0 | |||
| d0e4e0eec1 | |||
|
|
ac6e5e5638 | ||
| 0cd966c316 | |||
| 26e860f3b9 | |||
|
|
57ff385b02 | ||
| 81c3910ff1 | |||
| 9f1b1eed7e | |||
|
|
cca6c95762 | ||
| 92ce9f948a | |||
|
|
a8e2103eed | ||
| 24d60a8467 | |||
| e521fed916 | |||
| 9e5582a577 | |||
|
|
fa54e54ac6 | ||
| 46275fae35 | |||
|
|
3935e10a99 | ||
| adfc921c21 | |||
|
|
c336fd9346 | ||
| c2a6607dec | |||
|
|
a11c8de7c1 | ||
| 98062bc2ea | |||
|
|
1874518ea2 | ||
| 2a02d81104 | |||
| 9956aa9731 | |||
|
|
a7cbc3aec7 | ||
| b55a682286 | |||
|
|
02e070f52e | ||
| 6daed93ed5 | |||
| db1649e8e3 | |||
|
|
d8b3510925 | ||
| 243d75f324 | |||
|
|
8ae2d13648 | ||
| d89023b17e | |||
| dbf5a0cd1c | |||
|
|
296ac3b9d0 | ||
| 7f6c894493 | |||
|
|
962aec2243 | ||
| e6972f91a2 | |||
|
|
3b7f452f3f | ||
| 78e687ff7c | |||
| 26831ec466 | |||
|
|
2ee0e53ab0 | ||
| a561fd47c2 | |||
|
|
118f4bd42a | ||
| ec5930099b | |||
|
|
e2cd6bc990 | ||
| 39efdd0dac | |||
| dd97dd291c | |||
|
|
169460d5c8 | ||
| 949617c18e | |||
| 597f134997 | |||
|
|
6d6a4b78e9 | ||
| 008fe7676b | |||
| 001b108888 | |||
|
|
49c3cb2364 | ||
| c7ca904caa | |||
|
|
7a7765c10b | ||
| b634a12c6a | |||
|
|
d7823fcebc | ||
| a147272655 | |||
| b7710390fa | |||
|
|
9702c54572 | ||
| 241b04e6ff | |||
| 1dc776d888 | |||
| 3802a3ce61 | |||
|
|
6688861a95 |
@@ -9,7 +9,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: github.actor != 'github-actions[bot]'
|
if: github.actor != 'github-actions[bot]'
|
||||||
runs-on: self-hosted
|
#runs-on: self-hosted
|
||||||
container:
|
container:
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
steps:
|
steps:
|
||||||
@@ -65,10 +65,7 @@ jobs:
|
|||||||
|
|
||||||
# Push les modifications
|
# Push les modifications
|
||||||
git push origin master
|
git push origin master
|
||||||
- name: Run Changelog CI
|
|
||||||
uses: saadmk11/changelog-ci@v1.1.2
|
|
||||||
with:
|
|
||||||
release_version: ${{ steps.increment_version.outputs.new_version }}
|
|
||||||
|
|
||||||
- name: Use server_config_default as primary
|
- name: Use server_config_default as primary
|
||||||
run: mv /workspace/CLERC/Reskreen/config/server_config_default.py /workspace/CLERC/Reskreen/config/server_config.py
|
run: mv /workspace/CLERC/Reskreen/config/server_config_default.py /workspace/CLERC/Reskreen/config/server_config.py
|
||||||
@@ -91,10 +88,9 @@ jobs:
|
|||||||
docker push registry.resk-u.ch/clerc/reskreen:latest
|
docker push registry.resk-u.ch/clerc/reskreen:latest
|
||||||
|
|
||||||
|
|
||||||
- name: Call webhook $ {{ vars.CLERC_PROD_WEBHOOK}}
|
- name: Call webhook to maj stack
|
||||||
run: |
|
run: |
|
||||||
echo "Exécution de la commande: curl ${{ vars.CLERC_PROD_WEBHOOK }}"?repo=reskreen
|
curl -H "Authorization: Bearer ${{ secrets.WEBHOOK_TOKEN_RESKREEN }}" ${{ vars.CLERC_PROD_WEBHOOK }}/reskreen
|
||||||
curl ${{ vars.CLERC_PROD_WEBHOOK }}?repo=reskreen
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
test
|
test
|
||||||
test 2
|
test 2
|
||||||
test 3
|
test 3
|
||||||
|
test 4
|
||||||
@@ -19,6 +19,6 @@ RUN python -m venv venv \
|
|||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
#CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
|
#CMD ["python", "manage.py", "runserver", "0.0.0.0:8080"]
|
||||||
CMD ["sh", "-c", "source venv/bin/activate && python manage.py runserver 0.0.0.0:8080"]
|
CMD ["sh", "-c", "source venv/bin/activate && python manage.py collectstatic && python manage.py runserver 0.0.0.0:8080"]
|
||||||
#CMD ["./startup.sh"]
|
#CMD ["./startup.sh"]
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ INSTALLED_APPS = [
|
|||||||
'studenteval.apps.StudentevalConfig',
|
'studenteval.apps.StudentevalConfig',
|
||||||
'comm_op.apps.CommOpConfig',
|
'comm_op.apps.CommOpConfig',
|
||||||
'custom_admin.apps.CustomAdminConfig',
|
'custom_admin.apps.CustomAdminConfig',
|
||||||
|
'vsl.apps.VslConfig',
|
||||||
'rangefilter',
|
'rangefilter',
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
'carnet_rouge.apps.CarnetRougeConfig',
|
'carnet_rouge.apps.CarnetRougeConfig',
|
||||||
@@ -88,8 +89,6 @@ REST_FRAMEWORK = {
|
|||||||
|
|
||||||
LANGUAGE_CODE = 'fr-CH'
|
LANGUAGE_CODE = 'fr-CH'
|
||||||
|
|
||||||
if not cfg_dev_mode:
|
|
||||||
INSTALLED_APPS.append('nextcloud.apps.NextcloudConfig')
|
|
||||||
|
|
||||||
|
|
||||||
MEDIA_URL = '/media/'
|
MEDIA_URL = '/media/'
|
||||||
|
|||||||
@@ -19,10 +19,15 @@ from django.urls import path, include
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
from django.views.generic import RedirectView
|
from django.views.generic import RedirectView
|
||||||
|
from django.http import JsonResponse
|
||||||
|
from . import views
|
||||||
|
def healthcheck(request):
|
||||||
|
return JsonResponse({'status': True})
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', RedirectView.as_view(url='admin/login/', permanent=False), name='/'),
|
path('', RedirectView.as_view(url='admin/login/', permanent=False), name='/'),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
|
path('robots.txt', views.robots_txt),
|
||||||
path('accounts/', admin.site.urls),
|
path('accounts/', admin.site.urls),
|
||||||
path('collabs/', include('collabs.urls')),
|
path('collabs/', include('collabs.urls')),
|
||||||
path('vehicules/', include('vehicles.urls')),
|
path('vehicules/', include('vehicles.urls')),
|
||||||
@@ -35,6 +40,7 @@ urlpatterns = [
|
|||||||
path('editor/', include('django_summernote.urls')),
|
path('editor/', include('django_summernote.urls')),
|
||||||
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
|
||||||
path('api/auth/', include('authapp.urls')),
|
path('api/auth/', include('authapp.urls')),
|
||||||
|
path('healthcheck/', healthcheck),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
4
Reskreen/views.py
Normal file
4
Reskreen/views.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
from django.http import HttpResponse
|
||||||
|
|
||||||
|
def robots_txt(request):
|
||||||
|
return HttpResponse("User-agent: *\nDisallow: /\n", content_type="text/plain")
|
||||||
@@ -17,7 +17,7 @@ class CustomAuthToken(ObtainAuthToken):
|
|||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
response = super().post(request, *args, **kwargs)
|
response = super().post(request, *args, **kwargs)
|
||||||
token = Token.objects.get(key=response.data['token'])
|
token = Token.objects.get(key=response.data['token'])
|
||||||
return Response({'token': token.key, 'user_id': token.user_id})
|
return Response({'token': token.key, 'user_id': token.user_id, 'username': token.user.username})
|
||||||
|
|
||||||
class RegenerateTokenView(APIView):
|
class RegenerateTokenView(APIView):
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import os
|
import os
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
cfg_dev_mode = True
|
cfg_dev_mode = False
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
SECRET_KEY = 'django-insecure'
|
||||||
#SECRET_KEY = 'django-prod-j4jd&+4j^t_=@zr(#q@n!8e*58vkql6&_6w-t14ju8pw%ei%^s'
|
|
||||||
SECRET_KEY = 'django-insecure-j4jd&+4j^t_=@zr(#q@n!8e*58vkql6&_6w-t14ju8pw%ei%^s'
|
|
||||||
|
|
||||||
|
|
||||||
cfg_status_badge = "https://status.resk-u.ch/api/badge/22/uptime/744"
|
cfg_status_badge = "https://status.resk-u.ch/api/badge/22/uptime/744"
|
||||||
@@ -29,6 +27,7 @@ CORS_ALLOWED_ORIGINS = [
|
|||||||
"http://33.144.144.13:4173",
|
"http://33.144.144.13:4173",
|
||||||
"http://33.144.144.13:5173",
|
"http://33.144.144.13:5173",
|
||||||
"http://33.144.144.13:3000",
|
"http://33.144.144.13:3000",
|
||||||
|
"http://100.126.38.72:5173",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
# Exécute la tâche cron toutes les heures
|
# Exécute la tâche cron toutes les minutes
|
||||||
* * * * * cd /app && python /app/manage.py runcrons > /var/log/runcrons.log
|
* * * * * cd /app && python /app/manage.py runcrons > /var/log/runcrons.log
|
||||||
|
* * * * * curl -s https://status.resk-u.ch/api/push/6zvssVZGQEkLTJACSfHbKoj3rgwArwtp?status=up\&msg=OK\&ping= > /dev/null 2>&1
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ version: '3.8'
|
|||||||
services:
|
services:
|
||||||
backend:
|
backend:
|
||||||
image: registry.resk-u.ch/clerc/reskreen:latest
|
image: registry.resk-u.ch/clerc/reskreen:latest
|
||||||
labels:
|
|
||||||
node.labels.reskreen-ready: 'true'
|
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
@@ -32,19 +30,6 @@ services:
|
|||||||
- main-swarm-network
|
- main-swarm-network
|
||||||
logging:
|
logging:
|
||||||
driver: json-file
|
driver: json-file
|
||||||
frontend:
|
|
||||||
image: registry.resk-u.ch/clerc/clerc-frontend:latest
|
|
||||||
labels:
|
|
||||||
node.labels.reskreen-ready: 'true'
|
|
||||||
|
|
||||||
networks:
|
|
||||||
- main-swarm-network
|
|
||||||
configs:
|
|
||||||
-
|
|
||||||
source: env-reskreen-frontend
|
|
||||||
target: /app/frontend-app/.env
|
|
||||||
logging:
|
|
||||||
driver: json-file
|
|
||||||
deploy:
|
deploy:
|
||||||
update_config:
|
update_config:
|
||||||
delay: 10s
|
delay: 10s
|
||||||
@@ -54,8 +39,21 @@ services:
|
|||||||
placement:
|
placement:
|
||||||
constraints:
|
constraints:
|
||||||
- node.labels.reskreen-ready==true
|
- node.labels.reskreen-ready==true
|
||||||
|
frontend:
|
||||||
|
image: registry.resk-u.ch/clerc/clerc-frontend:latest
|
||||||
|
|
||||||
|
|
||||||
|
networks:
|
||||||
|
- main-swarm-network
|
||||||
|
configs:
|
||||||
|
-
|
||||||
|
source: env-reskreen-frontend
|
||||||
|
target: /app/frontend-app/.env
|
||||||
|
logging:
|
||||||
|
driver: json-file
|
||||||
|
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:3000/"]
|
test: ["CMD", "curl", "-f", "http://localhost:3000/healthcheck"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@@ -67,11 +65,7 @@ networks:
|
|||||||
external: true
|
external: true
|
||||||
volumes:
|
volumes:
|
||||||
reskreen-data:
|
reskreen-data:
|
||||||
driver: local
|
|
||||||
driver_opts:
|
|
||||||
device: /home/prod/Reskreen
|
|
||||||
o: bind
|
|
||||||
type: none
|
|
||||||
configs:
|
configs:
|
||||||
env-reskreen-frontend:
|
env-reskreen-frontend:
|
||||||
external: true
|
external: true
|
||||||
|
|||||||
@@ -204,9 +204,9 @@ class cls_caldav():
|
|||||||
if "$" in item.key:
|
if "$" in item.key:
|
||||||
item.team_transfert = True
|
item.team_transfert = True
|
||||||
item.key = item.key.replace("$","")
|
item.key = item.key.replace("$","")
|
||||||
if "Manif" in item.key:
|
if "manif" in item.key.lower():
|
||||||
item.team_manif = True
|
item.team_manif = True
|
||||||
item.key = item.key.replace("Manif", "")
|
item.key = item.key.replace("manif", "").replace("Manif", "").replace("MANIF", "")
|
||||||
item.name = arr[1]
|
item.name = arr[1]
|
||||||
if "&" in item.name:
|
if "&" in item.name:
|
||||||
arr = item.name.split("&")
|
arr = item.name.split("&")
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ def view_team_caldav(request):
|
|||||||
o_caldav = cls_caldav(url=caldav_cfg["team"])
|
o_caldav = cls_caldav(url=caldav_cfg["team"])
|
||||||
o_caldav.get_caldav_data(periode=3)
|
o_caldav.get_caldav_data(periode=3)
|
||||||
template = loader.get_template("team/team_view.html")
|
template = loader.get_template("team/team_view.html")
|
||||||
o_caldav.sort_array_by_key(True)
|
o_caldav.sort_array_by_key(False)
|
||||||
|
|
||||||
response = formatResponseArray(o_caldav)
|
response = formatResponseArray(o_caldav)
|
||||||
additional_data = {
|
additional_data = {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from vehicles.models import *
|
|||||||
|
|
||||||
class _vhc_admin(admin.ModelAdmin):
|
class _vhc_admin(admin.ModelAdmin):
|
||||||
|
|
||||||
list_display = ('sName', 'nBases', 'nStatus', "bLucas","bDrap")
|
list_display = ('sName', 'nBases', 'nStatus', "bLucas","bDrap", "nOrder")
|
||||||
ordering = ["nOrder"]
|
ordering = ["nOrder"]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,10 @@ class cl_Vehicles_Serializer(serializers.ModelSerializer):
|
|||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
def get_technique_infos(self, obj):
|
def get_technique_infos(self, obj):
|
||||||
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=1)
|
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=1).order_by('-dtCreated')
|
||||||
return cl_Vehicles_infos_Serializer(enabled_infos, many=True).data
|
return cl_Vehicles_infos_Serializer(enabled_infos, many=True).data
|
||||||
def get_matos_infos(self, obj):
|
def get_matos_infos(self, obj):
|
||||||
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=2)
|
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=2).order_by('-dtCreated')
|
||||||
return cl_Vehicles_infos_Serializer(enabled_infos, many=True).data
|
return cl_Vehicles_infos_Serializer(enabled_infos, many=True).data
|
||||||
def get_perempt_infos_fixes(self, obj):
|
def get_perempt_infos_fixes(self, obj):
|
||||||
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=3)[:3]
|
enabled_infos = Vehicles_infos.objects.filter(Vehicle=obj, bEnabled=True, nType=3)[:3]
|
||||||
|
|||||||
@@ -20,9 +20,12 @@ class VehicleViewset(viewsets.ModelViewSet):
|
|||||||
ordering = ['nType', 'nStatus', 'nOrder'] # Ordre par défaut
|
ordering = ['nType', 'nStatus', 'nOrder'] # Ordre par défaut
|
||||||
|
|
||||||
class VehicleInfosViewset(viewsets.ModelViewSet):
|
class VehicleInfosViewset(viewsets.ModelViewSet):
|
||||||
queryset = Vehicles_infos.objects.all()
|
queryset = Vehicles_infos.objects.all().order_by('-id')
|
||||||
serializer_class = cl_Vehicles_infos_Serializer
|
serializer_class = cl_Vehicles_infos_Serializer
|
||||||
permission_classes = [CustomPermission_DjangoModel_based]
|
permission_classes = [CustomPermission_DjangoModel_based]
|
||||||
|
ordering_fields = ['dtCreated']
|
||||||
|
ordering = ['dtCreated']
|
||||||
|
|
||||||
|
|
||||||
@xframe_options_exempt
|
@xframe_options_exempt
|
||||||
def view_vhc(request):
|
def view_vhc(request):
|
||||||
|
|||||||
0
vsl/__init__.py
Normal file
0
vsl/__init__.py
Normal file
11
vsl/admin.py
Normal file
11
vsl/admin.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from vsl.models import VslDest
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(VslDest)
|
||||||
|
class vsl_destAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('id', 'name')
|
||||||
|
|
||||||
|
ordering = ('id',)
|
||||||
|
list_per_page = 100
|
||||||
|
search_fields = ('name',)
|
||||||
6
vsl/apps.py
Normal file
6
vsl/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class VslConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'vsl'
|
||||||
23
vsl/migrations/0001_initial.py
Normal file
23
vsl/migrations/0001_initial.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.0.10 on 2025-06-04 16:48
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='VslDest',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID du Suivi')),
|
||||||
|
('name', models.CharField(max_length=255, verbose_name='Dénomination')),
|
||||||
|
('date_creation', models.DateTimeField(auto_now_add=True, verbose_name='Date de création')),
|
||||||
|
('date_modification', models.DateTimeField(auto_now=True, verbose_name='Date de modification')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.0.10 on 2025-06-04 16:49
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('vsl', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='vsldest',
|
||||||
|
old_name='date_creation',
|
||||||
|
new_name='dtCreate',
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='vsldest',
|
||||||
|
old_name='date_modification',
|
||||||
|
new_name='dtUpdate',
|
||||||
|
),
|
||||||
|
]
|
||||||
18
vsl/migrations/0003_rename_name_vsldest_dest.py
Normal file
18
vsl/migrations/0003_rename_name_vsldest_dest.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.0.10 on 2025-06-04 16:50
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('vsl', '0002_rename_date_creation_vsldest_dtcreate_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='vsldest',
|
||||||
|
old_name='name',
|
||||||
|
new_name='dest',
|
||||||
|
),
|
||||||
|
]
|
||||||
18
vsl/migrations/0004_rename_dest_vsldest_name.py
Normal file
18
vsl/migrations/0004_rename_dest_vsldest_name.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.0.10 on 2025-06-04 16:51
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('vsl', '0003_rename_name_vsldest_dest'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='vsldest',
|
||||||
|
old_name='dest',
|
||||||
|
new_name='name',
|
||||||
|
),
|
||||||
|
]
|
||||||
0
vsl/migrations/__init__.py
Normal file
0
vsl/migrations/__init__.py
Normal file
22
vsl/models.py
Normal file
22
vsl/models.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class VslDest(models.Model):
|
||||||
|
# ID auto-incrémenté par défaut
|
||||||
|
id = models.AutoField("ID du Suivi", primary_key=True)
|
||||||
|
|
||||||
|
# Champ de chaîne de caractères avec une longueur maximale de 255 caractères
|
||||||
|
name = models.CharField("Dénomination", max_length=255)
|
||||||
|
|
||||||
|
# Champ pour la date de création, automatiquement défini à la création
|
||||||
|
dtCreate = models.DateTimeField("Date de création", auto_now_add=True)
|
||||||
|
|
||||||
|
# Champ pour la date de modification, automatiquement mis à jour à chaque modification
|
||||||
|
dtUpdate = models.DateTimeField("Date de modification", auto_now=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
class Meta:
|
||||||
|
verbose_name = "Destination VSL"
|
||||||
|
verbose_name_plural = "Destinations VSL"
|
||||||
|
ordering = ["id"]
|
||||||
3
vsl/tests.py
Normal file
3
vsl/tests.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
3
vsl/views.py
Normal file
3
vsl/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
Reference in New Issue
Block a user