Commit bfacb5c2 authored by fred.perso's avatar fred.perso

Merge branch 'develop' into 'master'

Develop

Closes #14

See merge request !39
parents 48da6ba6 960673d9
.git
*.pyc
.env
.env.sample
#Postgis db
POSTGRES_DB=dbchirodb
POSTGRES_USER=dbuser
POSTGRES_PASSWORD=dbpwd123
#dbChiro App
DBCHIRO_APP_DIR=local_path_to_app_dir
DBCHIRO_MEDIA_DIR=local_path_to_media_dir
DBCHIRO_PORT=80
DBCHIRO_PROJ=4326
DBCHIRO_SETTINGS=production
DBCHIRO_SU_USERNAME=myusername
DBCHIRO_SU_PWD=myuserpwd
DBCHIRO_SU_EMAIL=mysuername@mydomain.tld
......@@ -20,4 +20,5 @@ core/static/img/logo_site.png
.vscode/*
/docs/build
/frontend/node_modules
.env
FROM python:alpine
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
WORKDIR /usr/src/dbchiro
COPY requirements.txt /usr/src/dbchiro
RUN apk add --no-cache \
--upgrade \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
postgresql-client \
libpq \
nginx\
&& apk add --no-cache \
--upgrade \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
--virtual .build-deps \
postgresql-dev \
zlib-dev jpeg-dev \
alpine-sdk \
&& apk add --no-cache \
--upgrade \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \
geos \
proj \
gdal \
binutils \
&& ln -s /usr/lib/libproj.so.15 /usr/lib/libproj.so \
&& ln -s /usr/lib/libgdal.so.20 /usr/lib/libgdal.so \
&& ln -s /usr/lib/libgeos_c.so.1 /usr/lib/libgeos_c.so \
&& mkdir /var/run/nginx
COPY requirements.txt /usr/src/dbchiro
RUN python3 -m pip install --upgrade pip --no-cache-dir \
&& python3 -m pip install -r requirements.txt --no-cache-dir \
&& python3 -m pip install gunicorn --no-cache-dir \
&& apk --purge del .build-deps
COPY docker-entrypoint.sh /usr/bin/docker-entrypoint.sh
COPY . /usr/src/dbchiro
VOLUME ["/dbchiro"]
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
v1.2.0
\ No newline at end of file
1.2.1
......@@ -20,9 +20,16 @@ from django.utils.translation import ugettext_lazy as _
from geodata.models import Territory
from management.models import CatchAuth
from django.contrib.auth import get_user_model
# Create your models here.
def get_sentinel_user():
return get_user_model().objects.get_or_create(username="deleted")[0]
class Profile(AbstractBaseUser, PermissionsMixin):
"""
An abstract base class implementing a fully featured User model with
......@@ -43,9 +50,7 @@ class Profile(AbstractBaseUser, PermissionsMixin):
"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
),
validators=[username_validator],
error_messages={
"unique": _("A user with that username already exists.")
},
error_messages={"unique": _("A user with that username already exists.")},
)
first_name = models.CharField(_("first name"), max_length=30)
last_name = models.CharField(_("last name"), max_length=30)
......@@ -53,9 +58,7 @@ class Profile(AbstractBaseUser, PermissionsMixin):
is_staff = models.BooleanField(
_("staff status"),
default=False,
help_text=_(
"Designates whether the user can log into this admin site."
),
help_text=_("Designates whether the user can log into this admin site."),
)
is_active = models.BooleanField(
_("active"),
......@@ -70,9 +73,7 @@ class Profile(AbstractBaseUser, PermissionsMixin):
default=False, verbose_name=_("Responsable d" "un territoire")
)
resp_territory = models.ManyToManyField(
Territory,
blank=True,
verbose_name=_("Territoires du rôle de coordinateur"),
Territory, blank=True, verbose_name=_("Territoires du rôle de coordinateur")
)
access_all_data = models.BooleanField(
default=False, verbose_name=_("Peut voir toutes les données")
......@@ -81,16 +82,15 @@ class Profile(AbstractBaseUser, PermissionsMixin):
default=False, verbose_name=_("Peut éditer toutes les données")
)
catchauth = models.ManyToManyField(
CatchAuth, blank=True, verbose_name=_("Authorisations de capture")
'management.CatchAuth',
blank=True,
verbose_name=_("Authorisations de capture"),
)
organism = models.CharField(
max_length=255, blank=True, null=True, verbose_name=_("Organisme")
)
home_phone = models.CharField(
max_length=50,
blank=True,
null=True,
verbose_name=_("Numéro de téléphone fixe"),
max_length=50, blank=True, null=True, verbose_name=_("Numéro de téléphone fixe")
)
mobile_phone = models.CharField(
max_length=50,
......@@ -119,9 +119,7 @@ class Profile(AbstractBaseUser, PermissionsMixin):
addr_country = models.CharField(
max_length=255, blank=True, null=True, verbose_name=_("Pays")
)
comment = models.TextField(
blank=True, null=True, verbose_name=_("Commentaire")
)
comment = models.TextField(blank=True, null=True, verbose_name=_("Commentaire"))
id_bdsource = models.CharField(max_length=100, blank=True, null=True)
bdsource = models.CharField(max_length=100, blank=True, null=True)
geom = models.PointField(
......
......@@ -18,7 +18,7 @@ class ProfileTable(tables.Table):
class="fa fa-fw fa-history"></i> Historique de la donnée</a></li>
<li><a href="{% url 'accounts:user_detail' record.pk %}" title="Fiche détaillée"><i class="fa fa-fw fa-info-circle" aria-hidden="true"></i> Fiche
détaillée</a></li>
<li><a href="{% url 'accounts:user_update' record.pk %}" title="Modifier"><i class="fa fa-fw fa-pencil-square-o"></i> Modifier le profil</a>
<li><a href="{% url 'accounts:user_update' record.pk %}" title="Modifier"><i class="fa fa-fw fa-edit"></i> Modifier le profil</a>
</li>
<li><a href="{% url 'accounts:user_password' record.pk %}" title="Modifier"><i class="fa fa-fw fa-key"></i> Modifier le mot de passe</a>
</li>
......
from django.conf.urls import url
from django.urls import path, re_path
from .views import UserCreate, UserUpdate, UserPassword, UserDelete, change_password, UserListView, UserDetail, MyProfileUpdate, \
MyProfileDetail
from .views import (
UserCreate,
UserUpdate,
UserPassword,
UserDelete,
change_password,
UserListView,
UserDetail,
MyProfileUpdate,
MyProfileDetail,
MyProfileDetailExport,
)
# from django.contrib.auth.urls import views
# from django.contrib.auth.paths import views
app_name = "accounts"
urlpatterns = [
url(r'^create/$', UserCreate.as_view(), name='user_create'),
url(r'^(?P<pk>[0-9]+)/update$', UserUpdate.as_view(), name='user_update'),
url(r'^(?P<pk>[0-9]+)/password$', UserPassword.as_view(), name='user_password'),
url(r'^(?P<pk>[0-9]+)/delete$', UserDelete.as_view(), name='user_delete'),
url(r'^(?P<pk>[0-9]+)/detail$', UserDetail.as_view(), name='user_detail'),
url(r'^myprofile/change_password$', change_password, name='change_password'),
url(r'^myprofile/detail$', MyProfileDetail.as_view(), name='myprofile_detail'),
url(r'^myprofile/update$', MyProfileUpdate.as_view(), name='myprofile_update'),
url(r'^list/$', UserListView.as_view(), name='user_search'),
path("create", UserCreate.as_view(), name="user_create"),
path("<int:pk>/update", UserUpdate.as_view(), name="user_update"),
path("<int:pk>/password", UserPassword.as_view(), name="user_password"),
path("<int:pk>/delete", UserDelete.as_view(), name="user_delete"),
path("<int:pk>/detail", UserDetail.as_view(), name="user_detail"),
path("myprofile/change_password", change_password, name="change_password"),
path("myprofile/detail", MyProfileDetail.as_view(), name="myprofile_detail"),
path("myprofile/detail/export", MyProfileDetailExport.as_view(), name="myprofile_detail_export"),
path("myprofile/update", MyProfileUpdate.as_view(), name="myprofile_update"),
path("list", UserListView.as_view(), name="user_search"),
]
import logging
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth import get_user_model, update_session_auth_hash
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.mail import send_mail
from django.shortcuts import render
from django.urls import reverse
from django.urls import reverse_lazy
from django.urls import reverse, reverse_lazy
from django.utils.translation import ugettext_lazy as _
from django.views.generic import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django_filters.views import FilterView
from django_tables2 import SingleTableView
from django.views.generic.base import TemplateResponseMixin
from django.forms.models import model_to_dict
from core.functions import generate_username
from .filters import ProfileFilter
......@@ -27,6 +29,7 @@ from .mixins import ManageAccountAuthMixin, ManageMyAccountAuthMixin
from .models import Profile
from .tables import ProfileTable
logger = logging.getLogger(__name__)
class UserCreate(ManageAccountAuthMixin, CreateView):
"""
......@@ -146,7 +149,7 @@ class UserPassword(ManageAccountAuthMixin, UpdateView):
def get_form_kwargs(self):
kwargs = super(UserPassword, self).get_form_kwargs()
username = self.object.username
print(username)
logger.debug(username)
return kwargs
def get_success_url(self):
......@@ -211,16 +214,29 @@ class UserDelete(ManageAccountAuthMixin, DeleteView):
class UserDetail(LoginRequiredMixin, DetailView):
model = get_user_model()
template_name = "accounts/profile.html"
class MyProfileDetail(LoginRequiredMixin, DetailView):
model = get_user_model()
template_name = "accounts/profile.html"
def get_object(self):
logger.info(self.request.user.id)
return get_user_model().objects.get(
id=self.request.user.id
) # or request.POST
)
class MyProfileDetailExport(LoginRequiredMixin,DetailView, TemplateResponseMixin):
model = get_user_model()
content_type="text/plain; charset=utf-8"
template_name = "accounts/personnal_data.txt"
def get_object(self):
logger.debug(self.request.user.id)
profile = get_user_model().objects.get(id=self.request.user.id)
dict = model_to_dict(profile)
del dict['password']
return dict
@login_required()
......
# -*- coding: utf-8 -*-
from django.conf.urls import url
from django.urls import path
from django.contrib.auth.decorators import login_required
from djgeojson.views import GeoJSONLayerView
from djgeojson.views import GeoJSONLayerView, TiledGeoJSONLayerView
from sights.models import Place
from sights.models import Territory, Municipality
from .views import (
......@@ -15,15 +17,15 @@ from .views import (
MetaPlaceAutocomplete,
metaplaces_as_geojson,
places_in_metaplaces_as_geojson,
places_in_metaplace_as_geojson
places_in_metaplace_as_geojson,
GeoJSONTiledPlaceData,
)
app_name = "general_api"
urlpatterns = [
# url(r'^place.geojson$',
# GeoJSONPlaceData.as_view(),
# name='geodata_place'),
url(
r"^municipality.geojson$",
path(
"municipality.geojson",
login_required(
GeoJSONLayerView.as_view(
model=Municipality,
......@@ -34,8 +36,8 @@ urlpatterns = [
),
name="geodata_municipality",
),
url(
r"^territory.geojson$",
path(
"territory.geojson",
login_required(
GeoJSONLayerView.as_view(
model=Territory, precision=3, simplify=0.5, properties=("name", "code")
......@@ -43,38 +45,47 @@ urlpatterns = [
),
name="geodata_territory",
),
url(r"^place.geojson$", places_as_geojson, name="geodata_place"),
url(r"^metaplaces.geojson$", metaplaces_as_geojson, name="geodata_metaplaces"),
url(r"^metaplaces/places.geojson$", places_in_metaplaces_as_geojson, name="geodata_places_in_metaplaces"),
url(r"^metaplaces/(?P<id>[0-9]+)/places.geojson$", places_in_metaplace_as_geojson, name="geodata_place_in_metaplace"),
# url(r'^place/(?P<z>\d+)/(?P<x>\d+)/(?P<y>\d+).geojson$',
# TiledGeoJSONLayerView.as_view(model=Place), name='placetiled'),
url(
r"^active-user-autocomplete/$",
path("place.geojson", places_as_geojson, name="geodata_place"),
path("metaplaces.geojson", metaplaces_as_geojson, name="geodata_metaplaces"),
path(
"metaplaces/places.geojson",
places_in_metaplaces_as_geojson,
name="geodata_places_in_metaplaces",
),
path(
"metaplaces/<int:pk>/places.geojson",
places_in_metaplace_as_geojson,
name="geodata_place_in_metaplace",
),
path(
"place/<int:z>/<int:x>/<int:y>",
GeoJSONTiledPlaceData.as_view(),
name="placetiled",
),
path(
"active-user-autocomplete/",
ActiveUserAutocomplete.as_view(),
name="active_user_autocomplete",
),
url(
r"^all-user-autocomplete/$",
path(
"all-user-autocomplete/",
AllUserAutocomplete.as_view(),
name="all_user_autocomplete",
),
url(r"^taxa-autocomplete/$", TaxaAutocomplete.as_view(), name="taxa_autocomplete"),
url(
r"^municipality-autocomplete/$",
path("taxa-autocomplete/", TaxaAutocomplete.as_view(), name="taxa_autocomplete"),
path(
"municipality-autocomplete/",
MunicipalityAutocomplete.as_view(),
name="municipality_autocomplete",
),
url(
r"^territory-autocomplete/$",
path(
"territory-autocomplete/",
TerritoryAutocomplete.as_view(),
name="territory_autocomplete",
),
url(
r"^place-autocomplete/$", PlaceAutocomplete.as_view(), name="place_autocomplete"
),
url(
r"^metaplace-autocomplete/$",
path("place-autocomplete/", PlaceAutocomplete.as_view(), name="place_autocomplete"),
path(
"metaplace-autocomplete/",
MetaPlaceAutocomplete.as_view(),
name="metaplace_autocomplete",
),
......
This diff is collapsed.
......@@ -11,24 +11,38 @@ from django.utils.translation import ugettext_lazy as _
class Actu(models.Model):
id_actu = models.AutoField(primary_key=True)
author = models.ForeignKey(
settings.AUTH_USER_MODEL, editable=True, verbose_name=_('Auteur'))
title = models.CharField(max_length=200, verbose_name=_('Titre'))
briefdescr = models.TextField(max_length=2048, verbose_name=_('Chapeau'))
text = RichTextField(verbose_name=_('Corps de l\'article'))
timestamp_create = models.DateTimeField(
auto_now_add=True, editable=False)
timestamp_update = models.DateTimeField(
auto_now=True, editable=False)
settings.AUTH_USER_MODEL,
editable=True,
verbose_name=_("Auteur"),
on_delete=models.CASCADE,
)
title = models.CharField(max_length=200, verbose_name=_("Titre"))
briefdescr = models.TextField(max_length=2048, verbose_name=_("Chapeau"))
text = RichTextField(verbose_name=_("Corps de l'article"))
timestamp_create = models.DateTimeField(auto_now_add=True, editable=False)
timestamp_update = models.DateTimeField(auto_now=True, editable=False)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL, null=True, db_index=True, editable=False, related_name='actu_creator')
settings.AUTH_USER_MODEL,
null=True,
db_index=True,
editable=False,
related_name="actu_creator",
on_delete=models.SET_NULL,
)
updated_by = models.ForeignKey(
settings.AUTH_USER_MODEL, null=True, db_index=True, editable=False, related_name='actu_modifier')
settings.AUTH_USER_MODEL,
null=True,
db_index=True,
editable=False,
related_name="actu_modifier",
on_delete=models.SET_NULL,
)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:actu_detail', kwargs={'pk': self.id_actu})
return reverse("blog:actu_detail", kwargs={"pk": self.id_actu})
class Meta:
verbose_name = "Actualité du site"
......
from django.conf.urls import url
from django.urls import path
from .views import ActuCreate, ActuUpdate, ActuDelete, ActuDetail, ActuList
urlpatterns = [
url(r'^$', ActuList.as_view(), name='home'),
url(r'^actu/list/page(?P<page>[0-9]+)/$', ActuList.as_view(), name='actu_list'),
url(r'^actu/(?P<pk>\d+)/detail$', ActuDetail.as_view(), name='actu_detail'),
url(r'^actu/add$', ActuCreate.as_view(), name='actu_create'),
url(r'^actu/(?P<pk>[0-9]+)/update$',
ActuUpdate.as_view(), name='actu_update'),
url(r'^actu/(?P<pk>[0-9]+)/delete$',
ActuDelete.as_view(), name='actu_delete'),
app_name = "blog"
]
urlpatterns = [
path("", ActuList.as_view(), name="home"),
path("actu/list/page<int:page>", ActuList.as_view(), name="actu_list"),
path("actu/<int:pk>/detail", ActuDetail.as_view(), name="actu_detail"),
path("actu/add", ActuCreate.as_view(), name="actu_create"),
path("actu/<int:pk>/update", ActuUpdate.as_view(), name="actu_update"),
path("actu/<int:pk>/delete", ActuDelete.as_view(), name="actu_delete"),
]
\ No newline at end of file
......@@ -88,7 +88,7 @@ class ActuList(ListView):
def get_context_data(self, **kwargs):
context = super(ActuList, self).get_context_data(**kwargs)
context['icon'] = 'fi-info'
context['icon'] = 'fas fa-info-circle'
context['title'] = _('Dernières actualités')
context['sightingsicon'] = 'fi-eye'
context['sightingscount'] = Sighting.objects.all().count()
......@@ -96,7 +96,7 @@ class ActuList(ListView):
context['placesicon'] = 'fi-marker'
context['placescount'] = Place.objects.all().count()
context['placestext'] = _('localités')
context['sessionsicon'] = 'fi-calendar'
context['sessionsicon'] = 'far fa-calendar-alt'
context['sessionscount'] = Session.objects.all().count()
context['sessionstext'] = _('sessions')
context['observersicon'] = 'fi-torsos-all-female'
......
......@@ -11,6 +11,7 @@ def version():
version = VERSION.read().replace("\n", "n")
return version
def get_sight_period(dateobs):
doy = dateobs.timetuple().tm_yday
w = int(settings.PERIOD_WINTERING_START)
......@@ -28,12 +29,12 @@ def get_sight_period(dateobs):
def generate_username(first_name, last_name):
fnl = first_name.split('-')
fnl = first_name.split("-")
fni = ""
for name in fnl:
fni = fni + name[0]
val = "{0}{1}".format(fni, last_name).lower()
val = re.sub('[!\' -@#$%,]', '', val)
val = re.sub("[!' -@#$%,]", "", val)
val = slugify(val)
x = 0
while True:
......
DateAndTimeInput = """
$(function () {
let Today = new Date(new Date().getFullYear(),
new Date().getMonth(),
new Date().getDate(),
23,59,59
)
$('.dateinput').datetimepicker({
useCurrent: false,
format: 'DD/MM/YYYY',
maxDate: Date.now(),
maxDate: Today,
showTodayButton: true,
showClear: true,
showClose: true
......@@ -18,10 +23,15 @@ DateAndTimeInput = """
DateInput = """
$(function () {
let Today = new Date(new Date().getFullYear(),
new Date().getMonth(),
new Date().getDate(),
23,59,59
)
$('.dateinput').datetimepicker({
useCurrent: false,
format: 'DD/MM/YYYY',
maxDate: Date.now(),
maxDate: Today,
showTodayButton: true,
showClear: true,
showClose: true
......
......@@ -2,21 +2,35 @@
Mixins
"""
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin
class ManageAccountAuthMixin:
'''
"""
Classe mixin de vérification que l'utilisateur possède les droits de créer le compte
'''
"""
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
return redirect("%s?next=%s" % (settings.LOGIN_URL, request.path))
else:
loggeduser = get_user_model().objects.get(id=request.user.id)
if loggeduser.edit_all_data or loggeduser.access_all_data or loggeduser.is_resp or loggeduser.is_staff or loggeduser.is_superuser:
return super(ManageAccountAuthMixin, self).dispatch(request, *args, **kwargs)
if (
loggeduser.edit_all_data
or loggeduser.access_all_data
or loggeduser.is_resp
or loggeduser.is_staff
or loggeduser.is_superuser
):
return super(ManageAccountAuthMixin, self).dispatch(
request, *args, **kwargs
)
else:
return redirect('core:view_unauth')
return redirect("core:view_unauth")
class AdminRequiredMixin(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
from django.conf.urls import url
from django.urls import path
from .views import (UnauthorizedModify, UnauthorizedView)
from .views import UnauthorizedModify, UnauthorizedView, SystemInformation
app_name = "core"
urlpatterns = [
# url d'erreurs
url(r'^unauthorizedmodify', UnauthorizedModify.as_view(), name='update_unauth'),
url(r'^unauthorizedview', UnauthorizedView.as_view(), name='view_unauth'),
path("unauthorizedmodify", UnauthorizedModify.as_view(), name="update_unauth"),
path("unauthorizedview", UnauthorizedView.as_view(), name="view_unauth"),
# Info systeme
path("sysinfo", SystemInformation.as_view(), name="sysinfo"),
]
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import TemplateView
from django.db import connection
from .mixins import AdminRequiredMixin
from .functions import version
import os
def db_datas():
with connection.cursor() as cursor:
cursor.execute("SELECT pg_size_pretty( pg_database_size( current_database() ) ), version(), postgis_version()")
row = cursor.fetchone()
print(row)
data = {}
data['database_size']= row[0]
data['database_pg_version'] = row[1]
data['database_postgis_version'] = row[2]
return data
class UnauthorizedModify(LoginRequiredMixin, TemplateView):
template_name = 'unauthorized.html'
template_name = "unauthorized.html"
def get_context_data(self, **kwargs):
context = super(UnauthorizedModify, self).get_context_data(**kwargs)
context['message'] = 'Vous n\'êtes pas autorisé à modifier ou supprimer cette donnée'
context[
"message"
] = "Vous n'êtes pas autorisé à modifier ou supprimer cette donnée"
return context
class UnauthorizedView(LoginRequiredMixin, TemplateView):
template_name = 'unauthorized.html'
template_name = "unauthorized.html"
def get_context_data(self, **kwargs):
context = super(UnauthorizedView, self).get_context_data(**kwargs)
context['message'] = 'Vous n\'êtes pas autorisé à voir cette donnée'
context["message"] = "Vous n'êtes pas autorisé à voir cette donnée"
return context
class SystemInformation(AdminRequiredMixin, TemplateView):
template_name = "sysinfo.html"
def get_context_data(self, **kwargs):
context = super(SystemInformation, self).get_context_data(**kwargs)
server_info = {}
server_info["dbchiro_version"] = version
server_info["hosting_server"] = os.uname()
sysinfo = {**server_info, **db_datas()}
context["sysinfo"] = sysinfo
return context
This diff is collapsed.
UTF-8
\ No newline at end of file
PROJCS["RGF93 / Lambert-93",GEOGCS["RGF93",DATUM["Reseau_Geodesique_Francais_1993",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","2154"]]
\ No newline at end of file
UTF-8
\ No newline at end of file
PROJCS["RGF93_Lambert_93",GEOGCS["GCS_RGF93",DATUM["D_RGF_1993",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["Meter",1]]
\ No newline at end of file
PROJCS["RGF93 / Lambert-93",GEOGCS["RGF93",DATUM["Reseau_Geodesique_Francais_1993",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6171"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4171"]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",49],PARAMETER["standard_parallel_2",44],PARAMETER["latitude_of_origin",46.5],PARAMETER["central_meridian",3],PARAMETER["false_easting",700000],PARAMETER["false_northing",6600000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","2154"]]
/* Schéma de travail */
create schema data_to_reimport;
/* Table de sauvegarde des données concernées */