Projet

Général

Profil

Bug #1218

gestion des urls front/backoffice

Ajouté par Thomas Noël il y a plus de 12 ans. Mis à jour il y a plus de 12 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
15 janvier 2012
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Planning:

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

Lié à Au quotidien - Bug #1216: L'élément de worflow "changer de statut après expiration" ne fonctionne pasFermé13 janvier 2012

Actions

Historique

#1

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.

#2

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)

#3

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 ?).

#4

Mis à jour par Thomas Noël il y a plus de 12 ans

  • Statut changé de Nouveau à En cours
#5

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
#6

Mis à jour par Thomas Noël il y a plus de 12 ans

Après discussion avec Fred et Benjamin, deux modifs à la proposition:
  • 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)
#7

Mis à jour par Thomas Noël il y a plus de 12 ans

  • Statut changé de En cours à Solution déployée
#8

Mis à jour par Thomas Noël il y a plus de 12 ans

  • Statut changé de Solution déployée à Fermé

Formats disponibles : Atom PDF