init depot GL

This commit is contained in:
Your Name 2018-02-27 16:23:03 +01:00
commit 6fadd7eea7
13 changed files with 172 additions and 0 deletions

0
README Normal file
View File

View File

@ -0,0 +1,10 @@
Metadata-Version: 1.0
Name: grandlyon-iodas
Version: 0.0.0
Summary: UNKNOWN
Home-page: http://example.net/
Author: Grand Lyon
Author-email: toto@example.net
License: UNKNOWN
Description: UNKNOWN
Platform: UNKNOWN

View File

@ -0,0 +1,8 @@
README
setup.py
grandlyon_iodas/__init__.py
grandlyon_iodas/models.py
grandlyon_iodas.egg-info/PKG-INFO
grandlyon_iodas.egg-info/SOURCES.txt
grandlyon_iodas.egg-info/dependency_links.txt
grandlyon_iodas.egg-info/top_level.txt

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@
grandlyon_iodas

View File

Binary file not shown.

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('base', '0008_auto_20180227_1502'),
]
operations = [
migrations.CreateModel(
name='grandlyonIodas',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=50, verbose_name='Title')),
('description', models.TextField(verbose_name='Description')),
('slug', models.SlugField(unique=True)),
('log_level', models.CharField(default=b'INFO', max_length=10, verbose_name='Log Level', choices=[(b'NOTSET', b'NOTSET'), (b'DEBUG', b'DEBUG'), (b'INFO', b'INFO'), (b'WARNING', b'WARNING'), (b'ERROR', b'ERROR'), (b'CRITICAL', b'CRITICAL'), (b'FATAL', b'FATAL')])),
('token_url', models.URLField(max_length=256, verbose_name='Token URL')),
('token_authorization', models.CharField(max_length=128, verbose_name='Token Authorization')),
('wsdl_url', models.CharField(max_length=256, verbose_name='WSDL URL')),
('verify_cert', models.BooleanField(default=True, verbose_name='Check HTTPS Certificate validity')),
('users', models.ManyToManyField(to='base.ApiUser', blank=True)),
],
options={
'verbose_name': 'Connecteur IODAS test',
},
),
]

View File

Binary file not shown.

109
grandlyon_iodas/models.py Normal file
View File

@ -0,0 +1,109 @@
import requests
import json
import hashlib
from suds.transport.http import HttpAuthenticated
from suds.client import Client
from suds.transport import Reply
import suds.sudsobject
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.cache import cache
from passerelle.base.models import BaseResource
from passerelle.utils.api import endpoint
from passerelle.utils.jsonresponse import APIError
from datetime import datetime
import dateutil.relativedelta
def sudsobject_to_dict(sudsobject):
out = {}
for key, value in suds.sudsobject.asdict(sudsobject).iteritems():
if hasattr(value, '__keylist__'):
out[key] = sudsobject_to_dict(value)
elif isinstance(value, list):
out[key] = []
for item in value:
if hasattr(item, '__keylist__'):
out[key].append(sudsobject_to_dict(item))
else:
out[key].append(item)
else:
out[key] = value
return out
class grandlyonIodas(BaseResource):
token_url = models.URLField(_('Token URL'), max_length=256)
token_authorization = models.CharField(_('Token Authorization'), max_length=128)
wsdl_url = models.CharField(_('WSDL URL'), max_length=256) # not URLField, it can be file://
verify_cert = models.BooleanField(default=True,
verbose_name=_('Check HTTPS Certificate validity'))
category = _('Business Process Connectors')
class Meta:
verbose_name = 'Connecteur IODAS Grand Lyon'
def get_token(self, renew=False):
cache_key = 'iodas-%s-token' % self.id
if not renew:
token = cache.get(cache_key)
if token:
return token
headers = {'Authorization': 'Basic %s' % self.token_authorization}
resp = self.requests.post(self.token_url, headers=headers,
data={'grant_type': 'client_credentials'},
verify=self.verify_cert).json()
token = '%s %s' % (resp.get('token_type'), resp.get('access_token'))
timeout = int(resp.get('expires_in'))
cache.set(cache_key, token, timeout)
self.logger.debug('new token: %s (timeout %ss)', token, timeout)
return token
def get_client(self):
class Transport(HttpAuthenticated):
def __init__(self, instance):
self.instance = instance
HttpAuthenticated.__init__(self)
def send(self, request):
#request.message = request.message.replace("contentType", "xm:contentType")
request.headers['Authorization'] = self.instance.get_token()
resp = self.instance.requests.post(request.url, data=request.message,
headers=request.headers,
verify=self.instance.verify_cert)
if resp.status_code == 401:
# ask for a new token, and retry
request.headers['Authorization'] = self.instance.get_token(renew=True)
resp = self.instance.requests.post(request.url, data=request.message,
headers=request.headers,
verify=self.instance.verify_cert)
return Reply(resp.status_code, resp.headers, resp.content)
return Client(url=self.wsdl_url, transport=Transport(self))
@endpoint(perm='can_access')
def getProcedures(self, request, nom, pren, datenais, dpap, typepro):
# Params in the order required by the WSDL from stambia
resp = self.get_client().service.ODA_getProcedures(dpap, typepro, pren, nom, datenais)
data = sudsobject_to_dict(resp)
# Counts procedures to get the last procedure
nbProc = (len(data['procedures']['procedures']['procedure']) - 1) if 'procedures' in data else ''
# recupere la liste des droits en cours de toutes les procedures d'un individu
droits = []
if 'procedures' in data :
for procedure in data['procedures']['procedures']['procedure'] :
for etape in procedure['etapes']['etape'] :
if 'taches' in etape :
for tache in etape['taches']['tache'] :
if tache['idtypetache'] == 2 and datetime.strptime(tache['datearret'], "%d/%m/%Y") > datetime.now():
moisfin = 1 if (datetime.strptime(tache['datearret'], "%d/%m/%Y") - dateutil.relativedelta.relativedelta(months=1)) == datetime.now() else 0
droits.append({"libl":tache['produit']['libl'], "dateproposition":tache['dateproposition'], "datearret":tache['datearret'], "dateeffet":tache['dateeffet'], "moisfin":moisfin})
return {'hash': hashlib.sha224(json.dumps(data)).hexdigest(),
'libl': data['procedures']['procedures']['procedure'][nbProc]['libl'] if 'procedures' in data else '',
'etapes': sorted(data['procedures']['procedures']['procedure'][nbProc]['etapes']['etape'], key=lambda x: x['id'], reverse=True) if 'procedures' in data else '',
'droits': droits,
'found': 1 if 'procedures' in data else 0}

BIN
grandlyon_iodas/models.pyc Normal file

Binary file not shown.

11
setup.py Normal file
View File

@ -0,0 +1,11 @@
#! /usr/bin/env python
from setuptools import setup, find_packages
setup(
name='grandlyon-iodas',
author='Grand Lyon',
author_email='toto@example.net',
url='http://example.net/',
packages=find_packages(),
)