diff --git a/master/bt5/vifib_slap/SkinTemplateItem/portal_skins/vifib_slap/HostingSubscription_requestRootSoftwareInstance.xml b/master/bt5/vifib_slap/SkinTemplateItem/portal_skins/vifib_slap/HostingSubscription_requestRootSoftwareInstance.xml index 5e2e11b325475404a72e82c22ba2c12799ee9ba1..3057b57811d477d71457cb03f918359d35d277a2 100644 --- a/master/bt5/vifib_slap/SkinTemplateItem/portal_skins/vifib_slap/HostingSubscription_requestRootSoftwareInstance.xml +++ b/master/bt5/vifib_slap/SkinTemplateItem/portal_skins/vifib_slap/HostingSubscription_requestRootSoftwareInstance.xml @@ -53,6 +53,7 @@ <value> <string encoding="cdata"><![CDATA[ from DateTime import DateTime\n +from Products.ERP5Type.DateUtils import getClosestDate, addToDate\n \n portal = context.getPortalObject()\n cleanup_resource = portal.portal_preferences.getPreferredInstanceCleanupResource()\n @@ -63,109 +64,145 @@ if (portal.portal_activities.countMessageWithTag(tag) > 0):\n # The software instance is already under creation but can not be fetched from catalog\n # As it is not possible to fetch informations, it is better to raise an error\n raise NotImplementedError(tag)\n +hosting_subscription = context\n \n sale_order_portal_type = "Sale Order"\n sale_order_line_portal_type = "Sale Order Line"\n hosting_subscription_portal_type = "Hosting Subscription"\n -if context.isRootSlave():\n +if hosting_subscription.isRootSlave():\n software_instance_portal_type = "Slave Instance"\n else:\n software_instance_portal_type = "Software Instance"\n \n # Mostly copy and paste from\n # portal_workflow/person_slap_interface_workflow/scripts/Person_requestSoftwareInstance\n -request_software_instance = context.portal_catalog.getResultValue(\n +request_software_instance = hosting_subscription.portal_catalog.getResultValue(\n portal_type=software_instance_portal_type,\n - title=context.getTitle(),\n - root_uid=context.getUid(),\n + title=hosting_subscription.getTitle(),\n + root_uid=hosting_subscription.getUid(),\n )\n \n -if request_software_instance is None:\n - setup_service_relative_url = portal.portal_preferences.getPreferredInstanceSetupResource()\n +if person is None:\n + open_sale_order_line = hosting_subscription.portal_catalog.getResultValue(\n + portal_type=\'Open Sale Order Line\', strict_aggregate_uid=hosting_subscription.getUid())\n + open_sale_order = open_sale_order_line.getParentValue()\n + person = open_sale_order.getDestinationSectionValue()\n \n - request_software_instance = portal.getDefaultModule(portal_type=software_instance_portal_type).newContent(\n - portal_type=software_instance_portal_type,\n - source_reference=context.getSourceReference(),\n - title=context.getTitle(),\n - text_content=context.getTextContent(),\n - sla_xml=context.getSlaXml(),\n - activate_kw={\'tag\': tag},\n - **portal.Base_getNewSoftwareInstanceCoordinate()\n - )\n - request_software_instance.portal_workflow.doActionFor(request_software_instance, \'validate_action\')\n - context.setPredecessorValueList(\n - context.getPredecessorValueList() + [request_software_instance]\n - )\n +new_one = False\n +if (request_software_instance is None):\n + new_one = True\n + setup_service_relative_url = portal.portal_preferences.getPreferredInstanceSetupResource()\n + request_software_instance = portal.getDefaultModule(portal_type=software_instance_portal_type).newContent(\n + portal_type=software_instance_portal_type,\n + source_reference=hosting_subscription.getSourceReference(),\n + title=hosting_subscription.getTitle(),\n + text_content=hosting_subscription.getTextContent(),\n + sla_xml=hosting_subscription.getSlaXml(),\n + activate_kw={\'tag\': tag},\n + **portal.Base_getNewSoftwareInstanceCoordinate()\n + )\n + request_software_instance.portal_workflow.doActionFor(request_software_instance,\n + \'validate_action\')\n +\n + software_release_document = context.portal_catalog.getResultValue(\n + portal_type=\'Software Release\',\n + url_string=hosting_subscription.getRootSoftwareReleaseUrl())\n \n - if not person_request:\n - packing_list_line = software_instance.getAggregateRelatedValue(portal_type="Sale Packing List Line")\n - software_release_document = context.portal_catalog.getResultValue(\n - portal_type=\'Software Release\',\n - url_string=context.getRootSoftwareRelease())\n - base_sale_packing_list = packing_list_line.getParentValue()\n - trade_condition = packing_list_line.getSpecialise(portal_type="Sale Trade Condition")\n - sale_order = portal.getDefaultModule(portal_type="Sale Order").newContent(\n - portal_type="Sale Order",\n - destination=base_sale_packing_list.getDestination(),\n - destination_section=base_sale_packing_list.getDestinationSection(),\n - destination_decision=base_sale_packing_list.getDestinationDecision(),\n - start_date=DateTime(),\n - received_date=DateTime(),\n - # XXX Hardcoded values\n - source="organisation_module/vifib_internet",\n - source_section="organisation_module/vifib_internet",\n - price_currency="currency_module/EUR",\n - activate_kw={\'tag\': tag},\n - )\n + sale_order = portal.getDefaultModule(portal_type=sale_order_portal_type).newContent(\n + portal_type=sale_order_portal_type,\n + destination_value=person,\n + destination_section_value=person,\n + destination_decision_value=person,\n + start_date=DateTime(),\n + received_date=DateTime(),\n + # XXX Hardcoded values\n + source="organisation_module/vifib_internet",\n + source_section="organisation_module/vifib_internet",\n + quantity_unit="unit/piece",\n + price_currency="currency_module/EUR",\n + activate_kw={\'tag\': tag},\n + )\n + sale_order_line = sale_order.newContent(\n + portal_type=sale_order_line_portal_type,\n + resource=setup_service_relative_url,\n + quantity=1,\n + price=0,\n + aggregate_value_list=[request_software_instance,\n + hosting_subscription,\n + software_release_document\n + ],\n + activate_kw={\'tag\': tag},\n + )\n + portal.portal_workflow.doActionFor(sale_order, "order_action")\n \n - setup_service_relative_url = portal.portal_preferences.getPreferredInstanceSetupResource()\n - sale_order.setSpecialise(trade_condition, portal_type="Sale Trade Condition")\n - sale_order_line = sale_order.newContent(\n - portal_type="Sale Order Line",\n - resource=setup_service_relative_url,\n - quantity=1,\n - aggregate_value_list=[request_software_instance,context,software_release_document],\n - activate_kw={\'tag\': tag},\n - )\n - sale_order.order()\n + # Update Open Order\n + # does this order have a client-specific Open Order\n + open_order = portal.portal_catalog.getResultValue(\n + default_destination_section_uid=person.getUid(),\n + portal_type="Open Sale Order",\n + validation_state="validated")\n + if open_order is None:\n + person_slap_interface_state = person.getSlapState()\n + if person_slap_interface_state == \'open_order_created\':\n + open_order_url = context.portal_workflow.getInfoFor(\n + ob=person, name=\'open_order_url\',\n + wf_id=\'person_slap_interface_workflow\')\n + open_order = portal.restrictedTraverse(open_order_url)\n + else:\n + raise ValueError(\'Person has no open order created\')\n \n - if context.getRootState() == \'started\':\n - request_software_instance.startRequested()\n - elif context.getRootState() == \'stopped\':\n - request_software_instance.stopRequested()\n + now = DateTime()\n + start_date = getClosestDate(target_date=now, precision=\'day\', before=1)\n + # 12 months of subscription by default\n + stop_date = addToDate(getClosestDate(target_date=now, precision=\'month\', before=1), year=1)\n +\n + subscription_service_relative_url = portal.portal_preferences.getPreferredInstanceSubscriptionResource()\n + open_order.newContent(\n + portal_type="Open Sale Order Line",\n + title=hosting_subscription.getTitle(),\n + aggregate_value=hosting_subscription,\n + start_date=start_date,\n + stop_date=stop_date,\n + quantity=1,\n + quantity_unit="unit/piece",\n + price=1,\n + price_currency="currency_module/EUR",\n + specialise=sale_order.getSpecialise(portal_type="Sale Trade Condition"),\n + # XXX Hardcoded values\\n\n + resource=subscription_service_relative_url,\n + destination_value=person,\n + destination_section_value=person,\n + source="organisation_module/vifib_internet",\n + source_section="organisation_module/vifib_internet",\n + activate_kw={\'tag\': tag},\n + )\n +\n + # Find Computer partition\n + # XXX Link subscript to open order\n else:\n + # Update existing software instance\n request_software_instance.edit(\n - text_content=context.getTextContent(),\n - source_reference=context.getSourceReference(),\n - sla_xml=context.getSlaXml(),\n + text_content=hosting_subscription.getTextContent(),\n + source_reference=hosting_subscription.getSourceReference(),\n + sla_xml=hosting_subscription.getSlaXml(),\n activate_kw={\'tag\': tag},\n )\n - destroyed = False\n - try:\n - cleanup_delivery_line = request_software_instance.Item_getInstancePackingListLine(\n - portal.portal_preferences.getPreferredInstanceCleanupResource()\n - )\n - if cleanup_delivery_line.getSimulationState() == \'delivered\':\n - destroyed = True\n - except ValueError:\n - pass\n -\n - if not destroyed:\n - if context.getRootState() == \'started\':\n - request_software_instance.startRequested()\n - request_software_instance.activate(after_tag=tag).requestStartComputerPartition()\n - elif context.getRootState() == \'stopped\':\n - request_software_instance.stopRequested()\n - request_software_instance.activate(after_tag=tag).requestStopComputerPartition()\n \n -return request_software_instance\n +if hosting_subscription.getRootState() == \'started\':\n + request_software_instance.startRequested()\n + if not new_one:\n + request_software_instance.activate(after_tag=tag).requestStartComputerPartition()\n +elif hosting_subscription.getRootState() == \'stopped\':\n + request_software_instance.stopRequested()\n + if not new_one:\n + request_software_instance.activate(after_tag=tag).requestStopComputerPartition()\n ]]></string> </value> </item> <item> <key> <string>_params</string> </key> - <value> <string>tag, person_request=False</string> </value> + <value> <string>tag, person=None</string> </value> </item> <item> <key> <string>id</string> </key> diff --git a/master/bt5/vifib_slap/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/scripts/Person_requestSoftwareInstance.xml b/master/bt5/vifib_slap/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/scripts/Person_requestSoftwareInstance.xml index b4f4016e4957e43a6d47c34208f3c61df1712312..cb8f253476538a63bb15a1bbc81d7b5fc4472141 100644 --- a/master/bt5/vifib_slap/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/scripts/Person_requestSoftwareInstance.xml +++ b/master/bt5/vifib_slap/WorkflowTemplateItem/portal_workflow/person_slap_interface_workflow/scripts/Person_requestSoftwareInstance.xml @@ -52,8 +52,6 @@ <key> <string>_body</string> </key> <value> <string encoding="cdata"><![CDATA[ -from DateTime import DateTime\n -from Products.ERP5Type.DateUtils import getClosestDate, addToDate\n person = state_change[\'object\']\n portal = person.getPortalObject()\n # Get required arguments\n @@ -80,142 +78,54 @@ tag = "%s_%s_inProgress" % (person.getUid(), \n \n # Check if it already exists\n cleanup_resource = portal.portal_preferences.getPreferredInstanceCleanupResource()\n -request_software_instance = None\n -for si in portal.portal_catalog(\n - portal_type=software_instance_portal_type,\n +request_hosting_subscription = None\n +for hs in portal.portal_catalog(\n + portal_type=hosting_subscription_portal_type,\n title=software_title,\n ):\n + si = hs.portal_catalog.getResultValue(title=software_title,\n + root_uid=hs.getUid())\n try:\n cleanup_delivery_line = si.Item_getInstancePackingListLine(cleanup_resource)\n except ValueError:\n - request_software_instance = si\n + request_hosting_subscription = hs\n break\n else:\n if cleanup_delivery_line.getSimulationState() != \'delivered\':\n - request_software_instance = si\n + request_hosting_subscription = hs\n break\n \n -if (request_software_instance is None):\n +if (portal.portal_activities.countMessageWithTag(tag) > 0):\n + # The software instance is already under creation but can not be fetched from catalog\n + # As it is not possible to fetch informations, it is better to raise an error\n + raise NotImplementedError(tag)\n +\n +if (request_hosting_subscription is None):\n hosting_subscription_reference = "HOSTSUBS-%s" % context.getPortalObject().portal_ids\\\n .generateNewId(id_group=\'slap_hosting_subscription_reference\', id_generator=\'uid\')\n - if (portal.portal_activities.countMessageWithTag(tag) > 0):\n - # The software instance is already under creation but can not be fetched from catalog\n - # As it is not possible to fetch informations, it is better to raise an error\n - raise NotImplementedError(tag)\n - else:\n -\n - setup_service_relative_url = portal.portal_preferences.getPreferredInstanceSetupResource()\n - software_instance = portal.getDefaultModule(portal_type=software_instance_portal_type).newContent(\n - portal_type=software_instance_portal_type,\n - source_reference=software_type,\n - title=software_title,\n - text_content=instance_xml,\n - sla_xml=sla_xml,\n - activate_kw={\'tag\': tag},\n - **portal.Base_getNewSoftwareInstanceCoordinate()\n - )\n - software_instance.portal_workflow.doActionFor(software_instance, \'validate_action\')\n - subscription = portal.getDefaultModule(portal_type=hosting_subscription_portal_type).newContent(\n - portal_type=hosting_subscription_portal_type,\n - reference=hosting_subscription_reference,\n - title=software_title,\n - periodicity_hour_list=[0],\n - periodicity_minute_list=[0],\n - periodicity_month_day=[1],\n - activate_kw={\'tag\': tag},\n - )\n - subscription.portal_workflow.doActionFor(subscription, \'validate_action\')\n - if state == \'started\':\n - software_instance.startRequested()\n - elif state == \'stopped\':\n - software_instance.stopRequested()\n -\n - software_release_document = context.portal_catalog.getResultValue(\n - portal_type=\'Software Release\',\n - url_string=software_release_url_string)\n -\n - sale_order = portal.getDefaultModule(portal_type=sale_order_portal_type).newContent(\n - portal_type=sale_order_portal_type,\n - destination_value=person,\n - destination_section_value=person,\n - destination_decision_value=person,\n - start_date=DateTime(),\n - received_date=DateTime(),\n - # XXX Hardcoded values\n - source="organisation_module/vifib_internet",\n - source_section="organisation_module/vifib_internet",\n - quantity_unit="unit/piece",\n - price_currency="currency_module/EUR",\n - activate_kw={\'tag\': tag},\n - )\n - sale_order_line = sale_order.newContent(\n - portal_type=sale_order_line_portal_type,\n - resource=setup_service_relative_url,\n - quantity=1,\n - price=0,\n - aggregate_value_list=[software_instance, subscription, software_release_document],\n - activate_kw={\'tag\': tag},\n - )\n - portal.portal_workflow.doActionFor(sale_order, "order_action")\n -\n - # Update Open Order\n - # does this order have a client-specific Open Order\n - open_order = portal.portal_catalog.getResultValue(\n - default_destination_section_uid=person.getUid(),\n - portal_type="Open Sale Order",\n - validation_state="validated")\n - if open_order is None:\n - person_slap_interface_state = person.getSlapState()\n - if person_slap_interface_state == \'open_order_created\':\n - open_order_url = context.portal_workflow.getInfoFor(\n - ob=person, name=\'open_order_url\',\n - wf_id=\'person_slap_interface_workflow\')\n - open_order = portal.restrictedTraverse(open_order_url)\n - else:\n - raise ValueError(\'Person has no open order created\')\n -\n - now = DateTime()\n - start_date = getClosestDate(target_date=now, precision=\'day\', before=1)\n - # 12 months of subscription by default\n - stop_date = addToDate(getClosestDate(target_date=now, precision=\'month\', before=1), year=1)\n -\n - subscription_service_relative_url = portal.portal_preferences.getPreferredInstanceSubscriptionResource()\n - open_order.newContent(\n - portal_type="Open Sale Order Line",\n - title=software_title,\n - aggregate_value=subscription,\n - start_date=start_date,\n - stop_date=stop_date,\n - quantity=1,\n - quantity_unit="unit/piece",\n - price=1,\n - price_currency="currency_module/EUR",\n - specialise=sale_order.getSpecialise(portal_type="Sale Trade Condition"),\n - # XXX Hardcoded values\\n\n - resource=subscription_service_relative_url,\n - destination_value=person,\n - destination_section_value=person,\n - source="organisation_module/vifib_internet",\n - source_section="organisation_module/vifib_internet",\n - activate_kw={\'tag\': tag},\n - )\n -\n - # Find Computer partition\n - # XXX Link subscript to open order\n + request_hosting_subscription = portal.getDefaultModule(portal_type=hosting_subscription_portal_type).newContent(\n + portal_type=hosting_subscription_portal_type,\n + reference=hosting_subscription_reference,\n + title=software_title,\n + source_reference=software_type,\n + text_content=instance_xml,\n + sla_xml=sla_xml,\n + periodicity_hour_list=[0],\n + periodicity_minute_list=[0],\n + periodicity_month_day=[1],\n + activate_kw={\'tag\': tag},\n + )\n + request_hosting_subscription.portal_workflow.doActionFor(request_hosting_subscription,\n + \'validate_action\')\n else:\n - # Update existing software instance\n - request_software_instance.edit(\n + request_hosting_subscription.edit(\n text_content=instance_xml,\n source_reference=software_type,\n sla_xml=sla_xml,\n activate_kw={\'tag\': tag},\n )\n - if state == \'started\':\n - request_software_instance.startRequested()\n - request_software_instance.activate(after_tag=tag).requestStartComputerPartition()\n - elif state == \'stopped\':\n - request_software_instance.stopRequested()\n - request_software_instance.activate(after_tag=tag).requestStopComputerPartition()\n +\n +request_hosting_subscription.HostingSubscription_requestRootSoftwareInstance(tag, person=person)\n ]]></string> </value> diff --git a/master/bt5/vifib_slap/bt/revision b/master/bt5/vifib_slap/bt/revision index 6cd3ae2db65ccbea2a8f15d2c6c98348543973c3..473995f402cba2afa276f045ef848fcbddef3b47 100644 --- a/master/bt5/vifib_slap/bt/revision +++ b/master/bt5/vifib_slap/bt/revision @@ -1 +1 @@ -493 +494 \ No newline at end of file