Project

General

Profile

Bug #1218

gestion des urls front/backoffice

Added by Thomas Noël almost 12 years ago. Updated almost 12 years ago.

Status:
Fermé
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
15 January 2012
Due date:
% Done:

0%

Estimated time:
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()

Related issues

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

Actions

History

#1

Updated by Benjamin Dauvergne almost 12 years ago

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

Updated by Thomas Noël almost 12 years ago

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

Updated by Thomas Noël almost 12 years ago

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

Updated by Thomas Noël almost 12 years ago

  • Status changed from Nouveau to En cours
#5

Updated by Thomas Noël almost 12 years ago

  • Subject changed from crash du cron d'expiration to gestion des urls front/backoffice
#6

Updated by Thomas Noël almost 12 years ago

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

Updated by Thomas Noël almost 12 years ago

  • Status changed from En cours to Solution déployée
#8

Updated by Thomas Noël almost 12 years ago

  • Status changed from Solution déployée to Fermé

Also available in: Atom PDF