Bug #1218
gestion des urls front/backoffice
0%
Description
Le cron d'expiration ne fonctionne pas si l'étape cible (celle qui suit l'expiration) contient des actions. La raison est dans ce traceback, où l'on voit que l'execution d'un workflow plante si la requete est None (ce qui est le cas dans un cron). Il faut sans doute gérer ça (req=None), pour faire en sorte que les workflows puissent être lancés en dehors d'une requête...?
Exception: type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'get_scheme'' Stack trace (most recent call first): File "/usr/lib/pymodules/python2.6/wcs/formdata.py", line 203, in get_url 201 def get_url(self, backoffice = False): 202 req = get_request() > 203 base_url = '%s://%s%s' % (req.get_scheme(), req.get_server(), 204 urllib.quote(req.environ.get('SCRIPT_NAME'))) 205 if backoffice: locals: self = <formdef.Test-Expiration-1-Min object at 0x326b650> req = None backoffice = False File "/usr/lib/pymodules/python2.6/wcs/workflows.py", line 552, in perform 550 return 551 > 552 url = formdata.get_url() 553 try: 554 mail_body = template_on_formdata(formdata, self.compute(self.body)) locals: formdata = <formdef.Test-Expiration-1-Min object at 0x326b650> self = <wcs.workflows.SendmailWorkflowStatusItem instance at 0x3b025a8> File "/usr/lib/pymodules/python2.6/wcs/workflows.py", line 171, in perform_items 169 old_status = formdata.status 170 for item in self.items: > 171 url = item.perform(formdata) or url 172 if formdata.status != old_status: 173 if not formdata.evolution: locals: url = None formdata = <formdef.Test-Expiration-1-Min object at 0x326b650> item = <wcs.workflows.SendmailWorkflowStatusItem instance at 0x3b025a8> depth = 20 old_status = 'wf-2' self = <wcs.workflows.WorkflowStatus instance at 0x3b02a28> File "/usr/lib/pymodules/python2.6/wcs/formdata.py", line 155, in perform_workflow 153 if self.status.startswith('wf-'): 154 wf_status = self.get_workflow_status() > 155 url = wf_status.perform_items(self) 156 elif self.status == 'new': 157 self.formdef.notify_new_receiver(self) locals: url = None self = <formdef.Test-Expiration-1-Min object at 0x326b650> wf_status = <wcs.workflows.WorkflowStatus instance at 0x3b02a28> File "/usr/lib/pymodules/python2.6/wcs/wf/timeout_jump.py", line 131, in _apply_timeouts 129 formdata.status = evo.status 130 formdata.store() > 131 formdata.perform_workflow() 132 break 133 f.close()
Demandes liées
Historique
Mis à jour par Benjamin Dauvergne il y a plus de 12 ans
Pour éviter de recopier la solution partout dans le code pourquoi pas une méthode globale
get_base_url() (dans la même veine que get_request(), get_request(), get_session(), etc..),
qui suivrait cette algo:
- if get_request() != NONE; return "%s://%s/" % (get_request().get_scheme(), get_request().get_server())
- x = get_cfg('base_url', None); return x if x
- return "http://%s/ % get_publisher().app_dir
Et on rajoute une clé de configuration base_url dans la config.
Mis à jour par Thomas Noël il y a plus de 12 ans
Benjamin Dauvergne a écrit :
Pour éviter de recopier la solution partout dans le code pourquoi pas une méthode globale
get_base_url() (dans la même veine que get_request(), get_request(), get_session(), etc..),
Oui pour moi, mais avec deux fonctions : get_frontoffice_url() et get_backoffice_root_url() associées à deux variables de config différentes (pour les cas frontoffice != backoffice, typiquement reverse-proxy et iframes)
Mis à jour par Thomas Noël il y a plus de 12 ans
Je propose ce qommon/url.py qui donnerait de la souplesse à la config.
A noter que j'ai inversé la logique proposée par Benj : si les URL sont configurées dans l'admin, elles prennent le dessus sur ce qui est indiqué dans la config ou dans les variables d'environnement.
import urllib from quixote import get_request, get_publisher from publisher import get_cfg def get_frontoffice_url(): frontoffice_url = get_cfg('misc', {}).get('frontoffice_url', None) if frontoffice_url: return frontoffice_url req = get_request() if req.get_environ('QOMMON_CANONICAL_FRONTOFFICE_URL'): return req.get_environ('QOMMON_CANONICAL_FRONTOFFICE_URL') server = req.get_environ('QOMMON_CANONICAL_HOSTNAME') or req.get_server() return '%s://%s%s' % (req.get_scheme(), server, urllib.quote(req.environ.get('SCRIPT_NAME'))) def get_backoffice_url(): backoffice_url = get_cfg('misc', {}).get('backoffice_url', None) if backoffice_url: return backoffice_url req = get_request() if req.get_environ('QOMMON_CANONICAL_BACKOFFICE_URL'): return req.get_environ('QOMMON_CANONICAL_BACKOFFICE_URL') server = req.get_environ('QOMMON_CANONICAL_HOSTNAME') or req.get_server() return '%s://%s%s/backoffice' % (req.get_scheme(), req.get_server(), urllib.quote(req.environ.get('SCRIPT_NAME')))
Si vous pensez que c'est ok, je patche là où nécessaire (appels à get_url & co) et j'ajoute la config dans /admin/sitename (ou ailleurs ?).
Mis à jour par Thomas Noël il y a plus de 12 ans
- Sujet changé de crash du cron d'expiration à gestion des urls front/backoffice
Mis à jour par Thomas Noël il y a plus de 12 ans
- pas de variables QOMMON_*, elles feraient double emploi sans intérêt
- si pas d'url dans la conf, les cron passeront automatiquement en http://nom_du_serveur/ où le nom du serveur est celui du répertoire
import os import urllib from publisher import get_cfg from quixote import get_request, get_publisher def get_frontoffice_url(): frontoffice_url = get_cfg('misc', {}).get('frontoffice_url', None) if frontoffice_url: return frontoffice_url req = get_request() if req: return '%s://%s%s' % (req.get_scheme(), req.get_server(), urllib.quote(req.environ.get('SCRIPT_NAME'))) return 'http://%s' % os.path.basename(get_publisher().app_dir) def get_backoffice_url(): backoffice_url = get_cfg('misc', {}).get('backoffice_url', None) if backoffice_url: return backoffice_url req = get_request() if req: return '%s://%s%s/backoffice' % (req.get_scheme(), req.get_server(), urllib.quote(req.environ.get('SCRIPT_NAME'))) return 'http://%s/backoffice' % os.path.basename(get_publisher().app_dir)