Bloc sociétés - tiago.goncalves - 06-10-2021
Bonjour,
Je travaille sur le module "Beaver" et j'essaye d’intégrer un bloc sociétés.
j'ai essayé de le faire dans menu --> Blocs -->modification BEAVER, mais je ne trouve le champ "Cible et source" dont j'ai besoin.
Du coup, je regarde le modulle "billing". La structure me semble différente du module Beaver.
J'ai vu que dans le répertoire views --> base.py, il y a la classe "class RelatedBaseCreation(generic.AddingInstanceToEntityPopup):" ligne 42.
j'essaye d'adapter le code avec l'ajout de la classe RelatedBeaverCreation dans views/beaver.py
Code : class RelatedBeaverCreation(generic.AddingInstanceToEntityPopup):
model = Beaver
# permissions: Union[str, Sequence[str], None] = 'billing'
permissions: Union[str, Sequence[str]] = 'beaver' # Need creation perm too
initial_status = 1
entity_id_url_kwarg = 'target_id'
entity_classes = [
persons.get_organisation_model(),
persons.get_contact_model(),
]
entity_form_kwarg = None
def get_initial(self):
initial = super().get_initial()
initial['status'] = self.initial_status
target = self.get_related_entity()
# initial['target'] = target # DEPRECATED
initial[
base_forms.BeaverTargetSubCell(model=self.model).into_cell().key
] = target
return initial
def get_success_url(self):
if bool_from_str_extended(self.request.GET.get('redirection', '0')):
return self.object.get_absolute_url()
return super().get_success_url()
de même pour customs_forms.py, apps.py, populate.py, models/beaver.py, forms/beaver.py.
Je me suis inspiré du didacticiel beaver §Formulaires personnalisés (CustomForms)
lors d'une cmd runserver, j'accède a ma liste de beaver mais quand je clique sur "create a beaver", j'ai une erreur "DoesNotExist at /beavers/beaver/add"
la vue création passe par custom_forms.BEAVER_CREATION_CFORM avec la traceback ci dessous.
Code : class BeaverCreation(generic.EntityCreation):
model = Beaver
#form_class = BeaverForm
form_class = custom_forms.BEAVER_CREATION_CFORM # <== NEW
Code : Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/beavers/beaver/add
Django Version: 3.2.7
Python Version: 3.9.5
Installed Applications:
['creme.creme_core.apps.ContentTypesConfig',
'django.contrib.auth',
'django.contrib.sessions',
'formtools',
'creme.creme_core.apps.MediaGeneratorConfig',
'creme.creme_core',
'creme.creme_config',
'creme.documents',
'creme.persons',
'creme.activities',
'creme.assistants',
'creme.graphs',
'creme.reports',
'creme.products',
'creme.recurrents',
'creme.billing',
'creme.opportunities',
'creme.commercial',
'creme.events',
'creme.crudity',
'creme.emails',
'creme.projects',
'creme.tickets',
'creme.vcfs',
'creme.geolocation',
'creme.audits',
'creme.beavers']
Installed Middleware:
['creme.creme_core.middleware.exceptions.Ajax500Middleware',
'creme.creme_core.middleware.exceptions.Ajax404Middleware',
'creme.creme_core.middleware.exceptions.Ajax403Middleware',
'creme.creme_core.middleware.exceptions.Beautiful409Middleware',
'creme.creme_core.middleware.exceptions.BadRequestMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'creme.creme_core.middleware.locale.LocaleMiddleware',
'creme.creme_core.middleware.global_info.GlobalInfoMiddleware',
'creme.creme_core.middleware.timezone.TimezoneMiddleware']
Traceback (most recent call last):
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 77, in dispatch
return super().dispatch(request, *args, **kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 168, in get
return super().get(request, *args, **kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 133, in get
return self.render_to_response(self.get_context_data())
File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 80, in get_context_data
context = super().get_context_data(**kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 66, in get_context_data
kwargs['form'] = self.get_form()
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\views\generic\edit.py", line 32, in get_form
form_class = self.get_form_class()
File "c:\users\omen\creme_crm\creme\creme_core\views\generic\add.py", line 88, in get_form_class
return self.get_custom_form_class(super().get_form_class())
File "c:\users\omen\creme_crm\creme\creme_core\views\generic\base.py", line 305, in get_custom_form_class
return form_class.build_form_class()
File "c:\users\omen\creme_crm\creme\creme_core\gui\custom_form.py", line 960, in build_form_class
return self.groups(item).form_class(
File "c:\users\omen\creme_crm\creme\creme_core\gui\custom_form.py", line 937, in groups
item = item or item_model.objects.get(cform_id=self.id)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\OMEN\creme_crm\venv\lib\site-packages\django\db\models\query.py", line 435, in get
raise self.model.DoesNotExist(
Exception Type: DoesNotExist at /beavers/beaver/add
Exception Value: CustomFormConfigItem matching query does not exist.
Si je passe par BeaverForm pour la classe BeaverCration, je n'ai pas d'erreur mais je n'est pas le bloc sociétés.
En premier, est ce que il est possible d'avoir ce bloc sociétés sans toucher au code ?
Si non, est ce la bonne démarche ? est ce que j'ai oublié quelque chose (j'ai fait la cmd creme_populate, makemigartions beavers et migrate, mais il n'y a aucun changement) ?
en complément mon custom_forms.py
Code : BEAVER_CREATION_CFORM = CustomFormDescriptor(
id='beavers-beaver_creation',
model=Beaver,
verbose_name=_('Creation form for beaver'),
base_form_class=beaver.BeaverCustomForm,
extra_sub_cells=[
beaver.BeaverSourceSubCell(model=Beaver),
beaver.BeaverTargetSubCell(model=Beaver),
],
)
merci de votre retour
Cordialement
Tiago
RE: Bloc sociétés - genglert - 08-10-2021
Bonjour,
vous parlez d'un "bloc Sociétés" mais sans expliquez ce que vous entendez par là ; c'est donc difficile de vous aider à faire ce que vous voulez. Il semble qu'il y ait confusion ; parfois vous parlez de "menu --> Blocs" (qui sert à configurer les blocs des vues détaillées, de l'accueil et de "Ma page"), et parfois vous dites "Si je passe par BeaverForm pour la classe BeaverCration, je n'ai pas d'erreur mais je n'est pas le bloc sociétés." (et donc vous parleriez des blocs qu'on trouve dans les formulaires, et qu'on configure dans menu > Configuration générale > Formulaires personnalisés). Vous semblez parler donc confondre 2 types de blocs différents ; et oui la différence n'est pas forcément évidente (en général je vais parler de "bloc des formulaires" pour le 2ème type).
Les formulaires personnalisés sont surtout importants pour les apps de base qui vont être amenées à être utilisés par des tas d'utilisateurs différents avec des besoins différents. Pour une app spécifique à des utilisateurs particulier un formulaire classique peut tout à fait faire l'affaire (bon même si certains utilisateurs indécis aime changer l'ordre des champs des formulaires toutes les semaines, auquel cas un formulaire personnalisé est indiqué...). Et oui, il est tout à fait possible d'avoir des blocs de formulaires dans un formulaire classique (les formulaires dans Creme ont des blocs depuis 10 ans, alors que les formulaires personnalisés sont apparus en 2.2) en utilisant l'attribut 'blocks' (regardez le fichier 'creme/creme_core/forms/base.py' et les divers exemples d'utilisation dans les formulaires des autres apps).
Si vous voulez quand même utiliser un formulaire personnalisé, votre message d'erreur semble indiquer que vous n'ayez pas correctement créé l'instance de 'CustomFormConfigItem' dans votre 'populate.py'.
RE: Bloc sociétés - tiago.goncalves - 08-10-2021
Bonjour,
Excusez moi je suis aller trop vite a ma problématique sans vraiment expliquer mon besoin clairement.
En fait, je souhaite associer un castor à une société ou à un contact. Comme sur le devis ou facture, ou on associe un devis/facture a une société ou a un contact.
je pensais qu'il fallait passé par un formulaire personnalisé pour faire cela.
je vais regardé du coté des blocs de formulaires dans un formulaire classique en utilisant l'attribut 'blocks' (regardez le fichier 'creme/creme_core/forms/base.py' et les divers exemples d'utilisation dans les formulaires des autres apps).
Merci
|