Ajout du repertoire extra avec droitdusol.css

This commit is contained in:
Etienne Loupias 2018-05-28 16:56:54 +02:00
parent 91e039b750
commit c8afe07c50
8 changed files with 297 additions and 79 deletions

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cartads', '0004_remove_cartads_application'),
]
operations = [
migrations.RemoveField(
model_name='cartads',
name='wsdl_url',
),
migrations.AddField(
model_name='cartads',
name='wsdl_url_etapedossier',
field=models.CharField(default='url', max_length=256, verbose_name='WSDL URL EtapeDossier'),
preserve_default=False,
),
migrations.AddField(
model_name='cartads',
name='wsdl_url_portail',
field=models.CharField(default='url', max_length=256, verbose_name='WSDL URL Portail'),
preserve_default=False,
),
]

Binary file not shown.

View File

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cartads', '0005_auto_20180424_1616'),
]
operations = [
migrations.RemoveField(
model_name='cartads',
name='wsdl_url_etapedossier',
),
migrations.RemoveField(
model_name='cartads',
name='wsdl_url_portail',
),
migrations.AddField(
model_name='cartads',
name='cle_token_gfi',
field=models.CharField(default='cle_token_gfi', max_length=128, verbose_name='Cle Token GFI'),
preserve_default=False,
),
migrations.AddField(
model_name='cartads',
name='sendfile_ws_url',
field=models.CharField(default='https://api-rec.grandlyon.com/ads-sendfile-rec/sendfile.aspx', max_length=256, verbose_name='sendfile ws url'),
preserve_default=False,
),
migrations.AddField(
model_name='cartads',
name='wsdl_ads_dir_url',
field=models.CharField(default='https://passerelle.guichet-recette.grandlyon.com/media/bap/cartads-rec/', max_length=256, verbose_name='WSDL ADS Dir URL'),
preserve_default=False,
),
]

View File

@ -84,8 +84,9 @@ def sudsobject_to_dict(sudsobject):
class CartADS(BaseResource):
token_url = models.URLField(_('Token URL'), max_length=256)
token_authorization = models.CharField(_('Token Authorization'), max_length=128)
wsdl_url_portail = models.CharField(_('WSDL URL Portail'), max_length=256) # not URLField, it can be file://
wsdl_url_etapedossier = models.CharField(_('WSDL URL EtapeDossier'), max_length=256) # not URLField, it can be file://
wsdl_ads_dir_url = models.CharField(_('WSDL ADS Dir URL'), max_length=256) # not URLField, it can be file://
sendfile_ws_url = models.CharField(_('sendfile ws url'), max_length=256) # not URLField, it can be file://
cle_token_gfi = models.CharField(_('Cle Token GFI'), max_length=128)
verify_cert = models.BooleanField(default=True,
verbose_name=_('Check HTTPS Certificate validity'))
# TODO : a mettre en param du connecteur
@ -148,7 +149,7 @@ class CartADS(BaseResource):
return Reply(resp.status_code, resp.headers, resp.content)
return Client(url=self.wsdl_url_portail+wsdl_file, transport=Transport(self, attachments))
return Client(url=self.wsdl_ads_dir_url+wsdl_file, transport=Transport(self, attachments))
@endpoint(perm='can_access', methods=['get','post'])
@ -244,7 +245,7 @@ class CartADS(BaseResource):
# TODO : mettre en parametre l'url du ws sendfile
for x in range(0, len(b64_fileContent)/size_max + 1):
#respHttp = self.requests.post('https://api-rec.grandlyon.com/ads-sendfile-dev/sendfile.aspx',
respHttp = self.requests.post('https://api-rec.grandlyon.com/ads-sendfile-rec/sendfile.aspx',
respHttp = self.requests.post(self.sendfile_ws_url,
data={'fileName': self.dirname+zipFileName,
'b64_fileContent': b64_fileContent[x*size_max:(x+1)*size_max],
'part': str(x),
@ -325,11 +326,12 @@ class CartADS(BaseResource):
#07/05/2018, avec "cle-secrete-gfi!", "!gf1-cl3-s3cr3t3", utilisée dans CartADS de REC :
#{'date':'23/01/2028 15:10:00','login':'gnm','password':'Gu!che7'}
if not "dev" in self.wsdl_url_portail:
return 'ieTluf0q6vwjitxope55YZ2ud0CEtuO9BBHr2hQaxySeDrz66mntHl83Wqj7oadMSyZqwSkzVdZJrQ92Zg2p3bwkAuv5yUzwmpBfdtAYYLE='
else:
#07/05/2018, avec "cle-secrete-gly!", "!gl1-cl3-s3cr3t3", utilisée dans CartADS de DEV :
#{'date':'23/01/2028 15:10:00','login':'gnm','password':'Gu!che7'}
if self.cle_token_gfi == "cle-secrete-gfi!":
return "ieTluf0q6vwjitxope55YZ2ud0CEtuO9BBHr2hQaxySeDrz66mntHl83Wqj7oadMSyZqwSkzVdZJrQ92Zg2p3bwkAuv5yUzwmpBfdtAYYLE="
#07/05/2018, avec "cle-secrete-gly!", "!gl1-cl3-s3cr3t3", utilisée dans CartADS de DEV :
#{'date':'23/01/2028 15:10:00','login':'gnm','password':'Gu!che7'}
if self.cle_token_gfi == "cle-secrete-gly!":
return "HQgzlNovC9eyesEH5Fl6P8aBDYkgtVDq/GiOxLL3XfhcsiRecO3IJyqXro6Z3wekk08QwXvVx9tqeqzk81MS8b4LYBhUkj2bFeiDGBsLHFc="
@ -373,11 +375,7 @@ class CartADS(BaseResource):
def getKey(objet):
return objet['id']
data = sorted(out, key=getKey)
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "data: ", data
return {'data': data}
return {'data': sorted(out, key=getKey)}
@endpoint(perm='can_access')
def get_liste_pdf(self, request, type_dossier):
@ -439,70 +437,61 @@ class CartADS(BaseResource):
resp = self.get_client('cartads-dossier.wsdl').service.GetInfosDossier(self.get_token_cartads(), id_dossier)
return {'data': sudsobject_to_dict(resp)}
@endpoint(perm='can_access')
def write_wcs_files(self, request, type_dossier):
h = HTMLParser.HTMLParser() # h.unescape(string) decode le html qui vient du web service en unicode : http://fredericiana.com/2010/10/08/decoding-html-entities-to-text-in-python/
output_string = u"<!--#### A inserer a partir du field 'Pi&#232;ces &#224; joindre' jusqu'a la fin des </fields> -->\n"
dict_resp = self.get_objets_demande(request, type_dossier)
for objet in dict_resp['data']:
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "objet: ", objet
#return {'data': dict_resp}
resp = self.get_pieces(request, type_dossier, objet["id"])
dict_resp = resp["data"]
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "dict_resp: ", dict_resp
date_file = datetime.datetime.now()
#TODO: faire un id unique et invariant si on reimporte le form (si ajout de champs dans le BO cartads)
#(par exemple : 1000*objet["id"]+10*no du champ+no de la piece si elle est envoyee 6 fois)
id = 100*objet["id"]
output_string += u"<field>\n"
output_string += u" <label>Pi&#232;ces &#224; joindre</label>\n"
output_string += u" <type>page</type>\n"
output_string += u" <condition>\n"
output_string += u" <type>python</type>\n"
output_string += u' <value>form_var_objet_raw == "'+str(objet["id"]).decode('utf8')+u'"</value>\n'
output_string += u" </condition><id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
def write_wcs_page(self, request, no_page, label_page, output_string, objet, id):
output_string += u"<field>\n"
output_string += u" <label>"+label_page+u"</label>\n"
output_string += u" <type>page</type>\n"
output_string += u" <condition>\n"
output_string += u" <type>python</type>\n"
output_string += u' <value>form_var_objet_raw == "'+str(objet["id"]).decode('utf8')+u'"'
if no_page==u"5":
output_string += u' and form_var_demolition == "Oui"'
output_string += u' </value>\n'
output_string += u" </condition><id>"+str(id).decode('utf8')+u"</id>\n"
output_string += u" </field><field>\n"
output_string += u' <label>&lt;p&gt;&lt;strong&gt;&lt;span style="color: rgb(134, 134, 134); font-family: Roboto, sans-serif; letter-spacing: 1px;"&gt;'+no_page+'. &lt;/span&gt;&lt;strong class="label" id="label'+str(id).decode('utf8')+u'"&gt;'+label_page+'&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;</label>\n'
output_string += u" <type>comment</type>\n"
# on incremente l'id du label apres rempli l'id labelxxxx du commentaire du label
id += 1
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
output_string += u" </field><field>\n"
output_string += u' <label>[is form_option_type_dossier "foo"] [end]'
output_string += u"\n"
output_string += u'&lt;span id="logo_commune"&gt;&lt;/span&gt;\n'
output_string += u"\n"
output_string += u"\n"
output_string += u'&lt;script type="text/javascript"&gt;\n'
output_string += u"function slugify(text)\n"
output_string += u"{\n"
output_string += u" return text.toString().toLowerCase()\n"
output_string += u" .replace(/\s+/g, '-') // Replace spaces with -\n"
output_string += u" .replace(/\'/g, '-') // Replace ' with -\n"
output_string += u" .replace(/&#244;/g, 'o').replace(/&#233;/g, 'e').replace(/&#232;/g, 'e') // Remove accent\n"
output_string += u" .replace(/[^\w\-]+/g, '') // Remove all non-word chars\n"
output_string += u" .replace(/\-\-+/g, '-') // Replace multiple - with single -\n"
output_string += u" .replace(/^-+/, '') // Trim - from start of text\n"
output_string += u" .replace(/-+$/, ''); // Trim - from end of text\n"
output_string += u"}\n"
output_string += u"function setLogo()\n"
output_string += u"{\n"
output_string += u' var selectedText ="[form_var_commune]";\n'
output_string += u" var communeChanged = slugify(selectedText);\n"
output_string += u" // Pour enlever arrondissement de Lyon\n"
output_string += u' if( selectedText.startsWith("Lyon") ) communeChanged = "lyon"\n'
output_string += u' $("#logo_commune").html(\'&lt;img src="[portal_url]static/grandlyon-gnm/producers/\'+communeChanged+\'.png" /&gt;\');\n'
output_string += u"}\n"
output_string += u"setLogo();\n"
output_string += u"&lt;/script&gt;\n"
output_string += u"\n"
output_string += u"</label>\n"
output_string += u" <type>comment</type>\n"
output_string += u" <extra_css_class>imgCommune</extra_css_class>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
if no_page==u"3":
output_string += u" </field><field>\n"
output_string += u' <label>[is form_option_type_dossier "foo"] [end]'
output_string += u"\n"
output_string += u'&lt;span id="logo_commune"&gt;&lt;/span&gt;\n'
output_string += u"\n"
output_string += u"\n"
output_string += u'&lt;script type="text/javascript"&gt;\n'
output_string += u"function slugify(text)\n"
output_string += u"{\n"
output_string += u" return text.toString().toLowerCase()\n"
output_string += u" .replace(/\s+/g, '-') // Replace spaces with -\n"
output_string += u" .replace(/\'/g, '-') // Replace ' with -\n"
output_string += u" .replace(/&#244;/g, 'o').replace(/&#233;/g, 'e').replace(/&#232;/g, 'e') // Remove accent\n"
output_string += u" .replace(/[^\w\-]+/g, '') // Remove all non-word chars\n"
output_string += u" .replace(/\-\-+/g, '-') // Replace multiple - with single -\n"
output_string += u" .replace(/^-+/, '') // Trim - from start of text\n"
output_string += u" .replace(/-+$/, ''); // Trim - from end of text\n"
output_string += u"}\n"
output_string += u"function setLogo()\n"
output_string += u"{\n"
output_string += u' var selectedText ="[form_var_commune]";\n'
output_string += u" var communeChanged = slugify(selectedText);\n"
output_string += u" // Pour enlever arrondissement de Lyon\n"
output_string += u' if( selectedText.startsWith("Lyon") ) communeChanged = "lyon"\n'
output_string += u' $("#logo_commune").html(\'&lt;img src="[portal_url]static/grandlyon-gnm/producers/\'+communeChanged+\'.png" /&gt;\');\n'
output_string += u"}\n"
output_string += u"setLogo();\n"
output_string += u"&lt;/script&gt;\n"
output_string += u"\n"
output_string += u"</label>\n"
output_string += u" <type>comment</type>\n"
output_string += u" <extra_css_class>imgCommune</extra_css_class>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
output_string += u" </field><field>\n"
output_string += u" <label>&lt;p&gt;&lt;strong&gt;2/ Votre dossier est pr&amp;ecirc;t &amp;agrave; &amp;ecirc;tre d&amp;eacute;pos&amp;eacute;.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Merci de nous faire parvenir les pi&amp;egrave;ces ci-dessous.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</label>\n"
output_string += u" <label>&lt;p&gt;&lt;strong&gt;Votre dossier est pr&amp;ecirc;t &amp;agrave; &amp;ecirc;tre d&amp;eacute;pos&amp;eacute;.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Merci de nous faire parvenir les pi&amp;egrave;ces ci-dessous.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</label>\n"
output_string += u" <type>comment</type>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
@ -518,7 +507,37 @@ class CartADS(BaseResource):
output_string += u" <allow_portfolio_picking>True</allow_portfolio_picking>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
output_string += u" </field>\n"
output_string += u" </field>\n"
return output_string, id
@endpoint(perm='can_access')
def write_wcs_files(self, request, type_dossier):
h = HTMLParser.HTMLParser() # h.unescape(string) decode le html qui vient du web service en unicode : http://fredericiana.com/2010/10/08/decoding-html-entities-to-text-in-python/
output_string = u"<!--#### A inserer a partir du field 'Pi&#232;ces obligatoires' jusqu'a la fin des </fields> -->\n"
# page en cours de construction : 0 = pieces obligatoires
current_page = 0
dict_resp = self.get_objets_demande(request, type_dossier)
for objet in dict_resp['data']:
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "objet: ", objet
#return {'data': dict_resp}
resp = self.get_pieces(request, type_dossier, objet["id"])
dict_resp = resp["data"]
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "dict_resp: ", dict_resp
date_file = datetime.datetime.now()
#TODO: faire un id unique et invariant si on reimporte le form (si ajout de champs dans le BO cartads)
#(par exemple : 1000*objet["id"]+10*no du champ+no de la piece si elle est envoyee 6 fois)
# Attention l'id ne doit pas contenir de - sinon provoque Internal Server error a l'import dans wcs
id = 100*objet["id"]
# page en cours de construction : 0 = pieces obligatoires
current_page = 0
output_string, id = self.write_wcs_page(request, u"3", u"Pi&#232;ces obligatoires", output_string, objet, id)
for piece in dict_resp['Piece']:
@ -526,6 +545,17 @@ class CartADS(BaseResource):
#for key, value in piece.items():
#print >> open('/home/grandlyon/log/'+type_dossier+'_'+date_file.strftime('%Y%m%d%H%M%S')+'.wcs', 'a+'), key,": ", value
#self.print_wcs_files(type_dossier, date_file, key+": "+str(value))
if piece["Reglementaire"] == False and current_page == 0:
# page en cours de construction : 1 = pieces selon le dossier
current_page = 1
output_string, id = self.write_wcs_page(request, u"4", u"Pi&#232;ces selon le dossier", output_string, objet, id)
if str(piece["CodePiece"]).startswith("PCA") and current_page == 1:
# page en cours de construction : 2 = pieces pour demolition
current_page = 2
output_string, id = self.write_wcs_page(request, u"5", u"Pi&#232;ces pour d&#233;molition", output_string, objet, id)
output_string += u"<field>\n"
output_string += u" <label>"+str(piece["CodePiece"]).decode('utf8')+u" - "+h.unescape(piece["Libelle"])+u"</label>\n"
output_string += u" <type>file</type>\n"
@ -543,7 +573,7 @@ class CartADS(BaseResource):
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
output_string += u"</field>\n"
#test : ajouter 5 PJ supplementaires par pièce
# ajoute 5 PJ supplementaires par pièce
for i in range(2):
output_string += u" <field>\n"
output_string += u" <label>"+str(piece["CodePiece"]).decode('utf8')+u" - "+h.unescape(piece["Libelle"])+u" "+str(i+1)+u"</label>\n"

Binary file not shown.

118
extra/static/droitdusol.css Normal file
View File

@ -0,0 +1,118 @@
/* img commune */
@media screen and (min-width: 1000px) {
.formdef-permis-de-construire .imgCommune img,
.formdef-certificat-d-urbanisme .imgCommune img {
position: absolute;
top: 132px;
left: 500px;
height: 100px;
}
}
/* File upload styling for permis de construire */
.formdef-permis-de-construire .FileWithPreviewWidget {
display: flow-root;
border-bottom: 0.1em solid #80808052;
background-color: #d3d3d333;
}
.formdef-permis-de-construire .FileWithPreviewWidget .title,
.formdef-permis-de-construire .FileWithPreviewWidget .content,
.formdef-permis-de-construire .FileWidget {
display: inline-block;
}
.formdef-permis-de-construire .widget .title {
padding: 10px;
}
.formdef-permis-de-construire form.quixote div.widget {
margin-bottom: 5px;
}
.formdef-permis-de-construire .FileWithPreviewWidget .content {
position: relative;
float: right;
max-width: 258px;
height: 35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.widget-required.has-no-file {
background-color: #ff000030;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file {
background-color: #b9d4b9;
}
.formdef-permis-de-construire .FileWithPreviewWidget .fileprogress,
.formdef-permis-de-construire .FileWithPreviewWidget .fileinfo {
position: relative;
top: -35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.widget-readonly .fileinfo {
top: 10px;
padding-right: 10px;
}
.formdef-permis-de-construire .FileWithPreviewWidget .hint {
position: relative;
color:#ffffff00;
padding: 3px 8px 5px 8px;
top: -10px;
left: -270px;
}
/*.formdef-permis-de-construire .FileWithPreviewWidget .hint:hover,*/
.formdef-permis-de-construire .FileWithPreviewWidget .hint:active {
position: relative;
background-color: #d0e3ff;
border: 0.01em solid #4e4e4e;
color: #000;
z-index: 99999;
}
.formdef-permis-de-construire .FileWithPreviewWidget .hint:before {
position: relative;
content: "ⓘ";
font-size: 1.3em;
color: #4242d0;
float: right;
top: -20px;
cursor: help;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus label,
.formdef-permis-de-construire .FileWithPreviewWidget.has-file .error,
.formdef-permis-de-construire .FileWithPreviewWidget.has-file .hint,
.formdef-permis-de-construire .FileWithPreviewWidget.plus {
display: none;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus {
display: flow-root;
position: relative;
top: -7px;
background-color: #b9d4b9;
height: 43px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus2 {
top: -14px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus3 {
top: -21px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus4 {
top: -28px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus5 {
top: -35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.plus.widget-readonly.has-no-file {
display: none;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-no-file .error {
left: -180px;
position: relative;
line-height: 0px;
color: red;
font-weight: bold;
top: -25px;
}
/* case à cocher */
.formdef-permis-de-construire .checkbox-cerfa .content,
.formdef-permis-de-construire .checkbox-cerfa .title {
display: inline;
}
.formdef-permis-de-construire .checkbox-cerfa .content {
float: left;
}