Commit 4a115cd6 authored by Łukasz Nowak's avatar Łukasz Nowak

Implement private and friends computers.

Now it is possible to lock down computer to be available only to owner or
selected friends.

Squashed commit of the following:

commit d46f5cd0d4eeb6ebe75481b6f555a5aca9eac511
Merge: 8477635 0737bcf0
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 17:59:32 2011 +0100

    Merge branch 'master' into ghostbusters

    Conflicts:
    	master/product/Vifib/tests/testVifibSlapComputerPartitionUpdate.py

commit 84776355fb2c110f56a3e237fbde87966b916cec
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 17:33:48 2011 +0100

    Usage report packing list also trigger this interaction script.

    Such delivery contains multiple lines

commit cebc827c7f4a349c517f83734468597e605e003a
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 15:35:55 2011 +0100

    Reindex partition when modifying the destruction deliveries

commit 2213015d184006ec18470af9ae9a8b0084653478
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 15:33:28 2011 +0100

    Put slave related tests to different file.

commit 2d2990b75ece15a8a87600459ee078ea99135e42
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 15:30:43 2011 +0100

    Removing partition from their table is the way to prevent new instanciation

commit e5d8540973a08d7fac565ee32f121ac7dc6d9a4a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 14:59:46 2011 +0100

    Follow slap library changes.

    Additionaly logout from slap too.

commit d902310cacae19e574e940fe4b74af33184874a7
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 14:49:14 2011 +0100

    Drop pdb.

commit 885bdaa31ced4df2b92b7e5a610ac5a476bb6e3f
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 14:08:00 2011 +0100

    Use portal_catalog to filter.

commit 669de4bcabaa1ded07dffdf9581b83f72514d29d
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 14:03:37 2011 +0100

    Update local roles in end of transaction.

    There are a lot of modifications on Open Sale Order happening during one
    transaction, so in order to fetch real data from open order during update local
    roles do it as late as possible during transaction.

commit d134011374e630837e84a4b7982c48b405202687
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 13:35:13 2011 +0100

    Partition are destroyed by the Computer

commit 6b78b0758e8e2410af73a821876fd6252d041176
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 11:58:06 2011 +0100

    User is not allowed to access the partition document.

commit ff7a324c4c00e2da84da4852dab37440a8f075e9
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 11:55:31 2011 +0100

    YAT-TA!

commit 023f6a92a5dfaba0ded9b0c8f04134ffc94f0f6c
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 11:34:39 2011 +0100

    Restore back Slave Instance destroyed support.

commit 4960b97da7f73be631c905f0852cfbe3c90c4fbd
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 11:28:12 2011 +0100

    Software type is provided by the sequence

commit 36e0c756fbe875e8a40989880581ab7a87609d4a
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 11:22:09 2011 +0100

    Instance software type is defined by the sequence.

commit 5e8c2db393761e4cd323415c04e2e07d23dbba50
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 11:15:01 2011 +0100

    state parameter may be already provided by method parameters.

commit 77be3f3608cd3f92ad76b5829dedd7aa39544945
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Nov 3 11:11:01 2011 +0100

    Drop failure expectations.

    After Romain avoided groups growing for a Person, this test shall pass.

commit d09f1d3173b96c24d57a37481a5f6e16a3346ed8
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 11:02:38 2011 +0100

    Restore hack to allow the validation of the instance

commit 2fe62055497be08b1b096a2bbc0e98222dc7f0a4
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 10:36:48 2011 +0100

    Prevent explosion of person security group.

    A person who has 1 million of Hosting Subscription should have limited number of security group.

commit 8d7b8f8417d1bbbbcf46f2a322b88fb22d0463b0
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Nov 3 10:08:54 2011 +0100

    Update XML

commit 969437b373090784e7350765251ec3a84b64a8eb
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 18:23:03 2011 +0100

    Synchronise software type with rest of tests.

commit e40d2b3a19de8fda8d400a338ac16fcde5f18f7a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 18:10:52 2011 +0100

    Use consitent way of activity locking.

commit 953c96a4224c997947e7fab743b8dbda55f716a8
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 16:40:32 2011 +0100

    Trigger only once per transaction.

commit d1ac5aa33b10657b47ed98369265fea64a461330
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 16:28:23 2011 +0100

    Separate requested software type from reference.

    While requesting Slave Partition software type have to be the same.

commit 765bdd2cee085494b48882b9894f901f3c42d904
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Nov 2 15:57:06 2011 +0100

    Person is not reindexed yet when the open order is created.

    No way to use set'Category'Uid in this case.

commit 2adf671815fec15152057eac200d280c0fd24b0b
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 15:49:27 2011 +0100

    Set reference too.

    It is used for example during login.

commit 3664995bdf9ae14326bcf759cf9fcaf61452d276
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Nov 2 15:37:04 2011 +0100

    Production manager can manage open sale order of customer.

commit e30281597dd4b33ed93e97bbea12c4bef476b65b
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 14:54:42 2011 +0100

    Mark expected failure.

commit 078b2f999b1d3bdc03ef92fd55f7d6e0ad432583
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 14:45:49 2011 +0100

    Stabilise assertions.

    In some cases different amount of packing lists are expected.

commit 27e48e872b566b6d04ec65640f0f2e0d35d5f8f0
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 14:42:53 2011 +0100

    Only one slave is checked.

commit 4ec1ec6abd717eee95f3d07220fe04510ce6032f
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 14:38:45 2011 +0100

    Returned delivery line can be for Slave Instance.

commit 860c4ed22ffb9f791d0287188fb1bafd9de5fd1f
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 14:25:35 2011 +0100

    Assert after each action.

    Again: it allows to raise early with understandable message.

commit b5e015e09ffa868c5c4fc843e52304e526818c3b
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 13:58:30 2011 +0100

    Allow to track Slave Instances.

commit 50b782d464945b8e423937ed4c8039f063d7524c
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 13:56:17 2011 +0100

    Show type.

    One then more portal type can be in module.

commit fc02501438d0c68461cebbfdbdb56edf0a2b681e
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Nov 2 13:57:17 2011 +0100

    Fix verification of instance's software_type

commit 3c25275654be1b0d9662ecb4696ffc2ca77d53fd
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 13:07:11 2011 +0100

    Force join in catalog queries.

    *_value is silently dropped while generating query.

commit a4a20493b5a17469b46c99f73049c35f1bbb917c
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 13:01:36 2011 +0100

    Force join.

    Passing _value just silently drops condition.

commit 63ed13b4d4893cafd7c0c8c14554852b8ea8f6a6
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 12:07:33 2011 +0100

    Edit in one shot.

commit 76e7ff5902d01e65349460e57915b9c6df1bc17b
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 12:00:06 2011 +0100

    Check that what shall be done is done.

    Those methods are working on higher level, so catch early any issue, instead of
    failing late with bizzare messages.

commit 6b850c84ee6c0d45c79186c9752c951e6bef8272
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 11:43:15 2011 +0100

    Revert "Allocation scope has higher priority then friend list."

    This reverts commit fdf5c9267828828a404d58ae529c6d24f79a6616.

    Real bug shall be hunted and fixed instead.

commit fdf5c9267828828a404d58ae529c6d24f79a6616
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 11:17:44 2011 +0100

    Allocation scope has higher priority then friend list.

    open/public is public, whatever is configuration of trade condition.

commit c0bce742a55b54bb0b4b333741326e0645ab2bae
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Nov 2 11:04:53 2011 +0100

    Slave partition have to request the same software type.

commit 735ff1f5691aafd8a1b2c8a03d1ea8c442a29313
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 10:10:30 2011 +0100

    When closing computer no change is done to friend list.

commit c55b84c97ca3a95c3891c694d15c27dccc260ae3
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 10:01:24 2011 +0100

    Simplify allocation/scope impact updates.

    open/personal shall result in STC for self.
    open/public shall result in STC for noone.
    open/friend shall have self always.

commit 0cac12ae1a6e8da407c7a1063d7b7f1296f7f0bd
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Wed Nov 2 10:00:00 2011 +0100

    Check destination_section category.

    It is more important than subject_list, as it impacts system behaviour.

commit 8b46e60ff9b1bce6f4b9b121aa6951f4d29219a8
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 18:54:36 2011 +0100

    Fix another stabilisation.

commit 03c80efc378131a1c91a524975131d52b1c1b3b1
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 18:52:08 2011 +0100

    Restabilise subject list checks.

commit fa95a4aa0c31ea7ae6a31405376f3fdea50e178c
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 18:34:24 2011 +0100

    Remove not used module.

commit 121245368c17003cd4a981c8eca50f0232509401
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 18:34:10 2011 +0100

    uid is needed too.

commit e99a4b52aabb573a25f13e8182fd1d33cc9144fd
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 18:28:22 2011 +0100

    Store software instance reference too.

    It is used to login.

commit 4d691bac97a42c594873b3c3fc2f964b7cb06df0
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 18:19:54 2011 +0100

    Bypass trade condition security to apply it.

commit 2e1d7d7eae03dd79e956fd75b8ca0f463fe35d7a
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 18:19:17 2011 +0100

    Use uid to discover the lastest deliveries.

commit a1ec726f1ff6d20e42db72573c803d736c2a8cf0
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 17:26:50 2011 +0100

    Implement friend based scenario.

commit 0fdbeb26d5376d8b5c70bf8f490b362014620dac
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 17:06:50 2011 +0100

    Follow changes in subject list configuration.

commit 10cbaa6cd8bf30743e71fa056331968cb9ec10b1
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 17:04:13 2011 +0100

    Manipulate subject_list in "intelligent" way.

    Non open/public computer shall have self in subject list.

commit 2f44ac44cf9fef2a7fce22461033a47729b33b5a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 16:57:49 2011 +0100

    Except different presentation of emptiness.

commit e57a74c2fdf176afded4baca70ad215a0f4ee996
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 16:37:26 2011 +0100

    Adding anyone to friend list adds owner.

commit c643564cb72eb320578997d545a2ad0c61f97d67
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 16:34:06 2011 +0100

    In case of adding friends, add self to friend list.

commit 6e6bb356c4c516fdcff6f1cfe20705159c351c2a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 16:20:09 2011 +0100

    Restrict search.

    This script can be run as super user, so no restriction will apply.

commit 8c86cdf8cdb950f6d9269fe1246a4df11f46daa2
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 16:01:47 2011 +0100

    Do the SQL join.

    destination_decision_value was just droppped.

commit d67eb23b1a335b4030934441433d73f3a29f2f3f
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 15:43:07 2011 +0100

    Create open order while opening assignment.

    Open Order have to exists as soon as possible, as they are used in security
    configuration.

commit 266a37a98e9c8e8be21f976a49636cf322fb9eaa
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 15:25:50 2011 +0100

    Computer is public in most tests.

commit 8b8a31d6fffeab565c68704c18849794edd57698
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 14:35:37 2011 +0100

    Wait for Trade Condition, Supply Line and computer.

    Trade Condition state might be chanining, and it is used in catalog queries.
    Supply Line and Computer relation might be ongoing, and it is important from
    catalog point of view.

commit a464172f5af751c3ef5bf3c8407df4777bd4f4c7
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 14:56:19 2011 +0100

    Define the computer as public.

commit 79e96382ff57bd5cb469e388a6068c7874ba348c
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 14:43:51 2011 +0100

    Share steps with more tests

commit ad12ae87ef8c6dcfa4d1f8fb050083ef11012883
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 13:58:19 2011 +0100

    Stabilise assertions.

    Sometimes empty means empty list and sometimes list of empty string.

commit 88bb5c78611a9ac04df4ff29856017e7f288df1b
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 13:34:34 2011 +0100

    Request twice.

    It is related with async request on slap library level.

commit 649d3789b3515307d022ed17a52742ffa05cf452
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 13:30:56 2011 +0100

    No need to mark busy again.

    Code was refactored to do it before.

commit 260958168f7898630d9d6788db527307677cb996
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 12:56:46 2011 +0100

    Pass positional arguments to External Method.

commit f01faa98a11b1d5f0231c90efe4518293b9fc05e
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 12:56:01 2011 +0100

    Change signature.

    There are issues with External Method calls.

    Sometimes the first argument is context object of call, sometimes it is first
    one passed. Force using positional arguments then.

commit 222dfe8e085e6871c25474a4acec5157768d1857
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 11:56:24 2011 +0100

    No timeout in tests.

commit 1c9c4f6e43530b1474b0e12899b3ed2e71898e3a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 11:51:13 2011 +0100

    Simplify.

commit 68d18b61ca3970432f67ce201b98d9b384a43222
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 11:37:30 2011 +0100

    Allow to access Open Sale Order for HS group.

commit 465410652d5bc427ed411dcb7c6eb12347485978
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 11:06:10 2011 +0100

    Use UnrestrictedMethod.

    It allows to do "atomic bomb security surgery" by defining exactly required
    security "escalation".

commit 26531ae9925d3e66f26ea285b71b10ce7a15f8a5
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 10:33:59 2011 +0100

    Find parent_uid in unrestricted environment.

    Computer is not accessible to Software Instance, but it is required to fetch
    correct computer partition.

commit ef4248cbee79440feee43117846c87217cc8e884
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 10:28:15 2011 +0100

    Fetch data as super user.

    According to configuration in this moment the data shall be available to
    Software Instance.

commit 05ac40d223350d885f78a9476a721451e2b8b969
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Mon Oct 31 09:59:10 2011 +0100

    Update local roles on Computer Partition too.

    It is required to give access to it for Software Instance user.

commit 4ac88d055622aaf6eddd04818eb6afc4753255bd
Author: Romain Courteaud <romain@nexedi.com>
Date:   Mon Oct 31 09:42:19 2011 +0100

    Give auditor role on busy partition.

    This will instance to find their IP.

commit 5d92540ee8bac32d2a15e3256614fb37a1e0ab61
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 18:51:56 2011 +0200

    Use acl_users instead of portal_membership.

    There were issues with getting roles in context with portal_membership.

commit 245113bc09d4424057e694e5f6625cb104977523
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 17:11:49 2011 +0200

    Shadow user need access to the computer module

commit b89983125ad1ab16e8604db0f52917cefce1227f
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 17:07:07 2011 +0200

    Fix assertion.

commit d83fc1b0299ecbc181199b2da6a48774c7ebf019
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:59:08 2011 +0200

    Update trade condition destination section after editing subject list

commit f26ac9e91e16e787e134fc886f06064b056c2f31
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:45:33 2011 +0200

    Set the subject list on the trade condition

commit 6dafd7814c58aef2b6aad74fa51e03d8d5b87760
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:21:41 2011 +0200

    Typo

commit 56e28fcebf48c0659da8fc6d5b27a9c03ef40e36
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:19:40 2011 +0200

    Wait for more activities

commit fa4004ed1d791d48a85e7b780a6787bbf579d2ad
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:17:59 2011 +0200

    Wait for more activities

commit 5c18218ddc1afe9275d78e3d24baafe3f21042d0
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 16:07:07 2011 +0200

    Typo

commit 8cf19d6ae4f3ba434de0d82d24bcf553199eb398
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 15:51:33 2011 +0200

    Rename method and simplify it.

    Shadow has no access to software instance, so all parameters have to be passed as strings.

commit 9133112a66c7ee87ad8e0e785d8ce9002988cc7f
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 15:36:26 2011 +0200

    Do not use the stock table to fetch the information

commit af43b6f61fb10723fd442f82b61ee622f91b0d42
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 15:33:17 2011 +0200

    Pass open_order as argument mapped to self.

commit 9ec82d031dc90a1e71b997843a1cdd0f1e709850
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 15:30:26 2011 +0200

    Call the method.

commit 1e8748f172c1def13f6a006bcb7d83c43a028987
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 15:14:49 2011 +0200

    Use shadow user to retrieve the partition

commit f2e94f302a677d677e16fe0965592f945b67779b
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 15:13:45 2011 +0200

    Return computer partition url.

    As Instance_findPartition is supposed to be called with the shadown user, prevent any unauthorized error later.

commit 1109e55ac90393bbea612ed8bb232eedc8cf9306
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 15:05:33 2011 +0200

    Shadow user should only be used to retrieve computer partition

commit bb2d019ab336a327fb64740e1f96c86f53b9fbfc
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:52:02 2011 +0200

    Trust the open order access restriction.

commit a9c1260e383e83455a87a11f7e508b999b18a477
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 14:48:26 2011 +0200

    Support software instance too.

commit 51a9fe407ff2ef5e7604e295b515f7197e90134f
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:42:43 2011 +0200

    Request partition as expected user

commit e7b4a4ef6ebbedb8768e4cacb9b7c26223c3b8e1
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:19:00 2011 +0200

    Call the right method on the expected object

commit 34d8bce9646b887c835d4ab74f5f2f20071dcfba
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:13:47 2011 +0200

    Typo

commit 3110fd198ae754f5abacca7bd61cc77d76b4c0dc
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:09:18 2011 +0200

    Simplify shadow user groups

commit 69ffdc5b7dd083ea22d83488fa3ee5bc786cc6d7
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 14:03:34 2011 +0200

    Simplify shadow user security group

commit d22d8d14782ff370cc12b5f7bc97eeba6c25c943
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 13:52:08 2011 +0200

    Return document instead of string

commit 112b3f600ba453a33dbf3bb6970b3f6beac6a8c8
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 13:48:06 2011 +0200

    Add more groups for Person and Software Instance.

    Each Person and Software Instance belong to role/open_order group and related
    Open Sale Order group.

commit 3ec9d3c1ca79ba2f7c7540f0d90f9cc715eec327
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 13:46:18 2011 +0200

    Add shadow role.

commit 327586b2cb0223ae8f3c1e924fe7f95b5a6dbb87
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 13:08:39 2011 +0200

    Typo

commit 10c09cc29d9897b14580fd68e429a5cb656fc353
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 12:06:39 2011 +0200

    Add role/open_order category.

commit 63cbe8c9efc11fa8a875bb72736b77fd7cc9dbb5
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 12:05:17 2011 +0200

    Give role/openorder to Open Sale Order users.

commit 5833ae265a0d824f33544ba6cf884f7b2d130d7a
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 12:02:17 2011 +0200

    Generate computer local roles based on related open sale order reference.

commit 2dfdf0c5760faff5ee07e198fd528a584a2751e3
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 11:59:04 2011 +0200

    Restrict the list of trade condition to update

commit 6717f88ec88bfa828e1ab5c7f395ea8d0f6d571e
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 11:33:10 2011 +0200

    Instance needs to access the sale trade condition module

commit 9fe47b072b488055412b0c7f337f5031c2845e80
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 11:30:51 2011 +0200

    Open Sale Order already has generated reference (configured on portal type)

commit 175544e3e994bdaf04a4db7124c9172a4ded79f2
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 11:28:58 2011 +0200

    Change Sale Trade Condition security.

    Give instance Auditor role for public sale trade condition.

    "Friends" security is based on the member's open sale order.

commit 08982cbaac1f687c5eb3c0454421124a13883ee0
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 11:23:08 2011 +0200

    Remove not needed commented out code.

commit a62497f2381d71bcaa3a8d1ecb9a4e322865b9bd
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 11:17:45 2011 +0200

    Do not catalog creation/modification date.

    In Vifib those dates are not used.

    There is issue with getting creation/modification date on big workflows, which
    leads to (1) high memory consumption and (2) not freeing memory later.

    Vifib workflows have ten thousands of entires (and they grow), so until proper
    solution if found it is better to avoid often calculation of those dates.

commit dfc47913cfe682151fe48b17ccad25011c673dfc
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 11:14:50 2011 +0200

    Do not use creation date.

    Sale Packing List Lines can be safely sorted by its start date.

commit e18600a6bb479feb2254c29fbeb3a67019f7cf90
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 11:09:25 2011 +0200

    Finalise switch method.

    Simplify passed arguments -- any callable with arguments can be passed.

commit 335781cdf5e351af0ed0cc15798fa4986641a847
Author: Romain Courteaud <romain@nexedi.com>
Date:   Fri Oct 28 10:36:48 2011 +0200

    Typo

commit 07e77a6b50b01c9d1707e571d9c1bc81ed4bfada
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 10:33:04 2011 +0200

    Fix copy&paste mistake.

commit 4b4e52f9a5bfe28417027f20c1fd1332f1594e34
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Fri Oct 28 10:10:48 2011 +0200

    Disable failing functionality.

commit 45be4c6debd598375c4573637b67b9dd5bab8a66
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:26:39 2011 +0200

    WIP external method to run code as 'shadow' user

commit 601dbcf27af93df7b1fc0c2efc7d2e0e4d36e7ca
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:24:26 2011 +0200

    Forgotten modification in previous commit

commit e6700aad6ae15947cbf3949e1548bd7795214f1b
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:23:32 2011 +0200

    Initialize open sale order reference

commit 6b5dc641dc8c69747abbd466b5794ce257508257
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:16:36 2011 +0200

    Only catalog instanciated software release for busy partition

commit 8e6286bec236472278eea19bf6218d13999d929c
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:06:49 2011 +0200

    Software instance type is stored on source_reference

commit e9f36426196c5e03619dd700bd5eae47cf880ef2
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 19:05:54 2011 +0200

    Filter busy partition by software type

commit ef49bb2aa01f1c7cb8f8541855f688ab4d9a0577
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 18:54:49 2011 +0200

    Share the code by using Instance_findPartition

commit e7ff5c843747c58748d6e1f760500eb328d8675e
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 18:51:25 2011 +0200

    Prevent copy/paste by creating a new script to find a partition

commit 4e71ade4a9ef5c401649c249c99639436bc9361a
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 18:15:35 2011 +0200

    Activate shadow plugin in tests.

commit 5e6bfd51e8432755512b3a5538f6a03c6b0ed0a5
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 18:12:19 2011 +0200

    Initiate development of shadow plugin.

    Shadow users will allow to have a "bit different" groups then normal ones.

    They will be used in order to select normally not available objects (like
    computer).

    This plugin will disallow normal login (not extract credentials), as it shall
    be used only internally (similarly to sudo).

commit 0376d8ad540cb4e9b5226735a2f05128b163fd93
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:45:02 2011 +0200

    Implement test_start_computer_partition_allocation_scope_close.

commit aa40a28011583a2860c16b1b8674f4c08c208614
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:26:28 2011 +0200

    YATTA: Yet Another Test To check After close start behaviour.

commit 32a740cfb9e000ada553c4ec1f2c968606547794
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:22:15 2011 +0200

    Finalise skeletonising request.

    Only friend partition request case is left.

commit 3afb0e4a3093c706d78e581e3364dd2c05925ba5
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 17:10:57 2011 +0200

    Restrict workflow action usage

commit 18d637876789a24154cd4bb10ca5476d0426da6f
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:07:17 2011 +0200

    Skeletonise more tests for request.

    Also do additional check: proof that even if someone incorrect was not able
    to request instance, correct one (the friend, the owner) can do it. Thanks to
    this the test assuers (quite well...) that refusal of requestion was because
    of configuration and not artificial problem.

commit 4b62f9e2d04844b2ee7881eed553500e66597969
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:06:12 2011 +0200

    Cover open/friend with friend.

commit d75b15bd453eeb128c5ee0e89839ec7618a0fc50
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 17:05:13 2011 +0200

    Allow to login as test_vifib_customer_a

commit 2d06c16c9d909ed50e87fd6c282f15a0b1919617
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:55:16 2011 +0200

    Start covering cases of software instance request.

commit 48b411bb511b1e8a3bd66ec4a5ed1c0fa028ac14
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:47:06 2011 +0200

    YAT(ta).

    Yet another typo (ta).

commit 33d72cddf8b6d04bfe27ad430ad28d8c482ab875
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:45:55 2011 +0200

    Typo.

commit ebb1051c1556996de683fd31189078e1787968fa
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:44:18 2011 +0200

    Cover empty allocation scope.

commit fc59fed9c51a8b007dae40c196d8e1cac8b641b5
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:42:46 2011 +0200

    Cover case of allocation scope close.

commit 96c01c7cb5061a3abfabea013148098a1c929407
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:38:04 2011 +0200

    Test open/public allocation scope.

commit a0a6fb15048a6b1e6256066b020eda667a5084bc
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:32:29 2011 +0200

    Finish open/personal allocation scope test.

commit 2349abad932e516790f94329a6fbf52668465c6c
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 16:07:08 2011 +0200

    Validated in the end.

    It will allow to fetch data about the object.

commit 0cb5494eecd794fe54365a6f4603e82bedcdfbee
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 15:55:03 2011 +0200

    Initialize sale trade condition reference

commit 6199dbfffcd3733e522453f25e332911fbbead84
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 15:39:26 2011 +0200

    Request on known computer.

commit 6a84303ca83288c0889b96c43e4ccc1d0f8d4546
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 15:39:07 2011 +0200

    Support sla_xml for person.

commit e78beca259b9245b14e40c2763b9610bf4d77ce3
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 15:34:27 2011 +0200

    Copy/paste is an easier solution to get ride of typo...

commit 90ff7420c52997f6ad1321b5c3c319be2d858388
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 15:28:21 2011 +0200

    Typo in script name

commit 45712d0d62f4177eae8b499819be93dab75accb4
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 15:25:09 2011 +0200

    Revert "Update local roles in end of transaction."

    This reverts commit aff2708b66a9037d3f67d46951d28af6dc227872.

commit 1f1a6f2c4955362c3493441df9682cf3f71f29fe
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 15:21:22 2011 +0200

    Add more test steps.

commit 22fe142f112208b1c0de78ef03d7629d2d0c5775
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 15:13:42 2011 +0200

    Tic after publishing software release.

commit aff2708b66a9037d3f67d46951d28af6dc227872
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 14:44:44 2011 +0200

    Update local roles in end of transaction.

    During the whole transaction roles could have not expected result.

commit 7f08884155a69d6fc7c8a71dd44283f8fb8450aa
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 15:16:27 2011 +0200

    XML changes

commit af224b4cfaf845b6d17b3d48aefce2cb1966a007
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 15:10:23 2011 +0200

    Give Auditor role on computer depending on sale trade condition configuration.

commit 374e08157bac0aed48add551310837dfa6041f59
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 14:32:13 2011 +0200

    Initiate test implementation.

commit c761161e430002b808cede00d1a5f5eeae01b406
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 14:11:53 2011 +0200

    Send empty string in case of no list.

commit 112b090b111f1405b13e47e7556a713f1bb088f5
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 13:55:57 2011 +0200

    Sekeltonise allocation scope tests.

commit 838c5dcd3660c452c8e7e49471cad35182a4ef27
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 14:30:53 2011 +0200

    Supplier of the trade condition should be allowed to modify it.

commit 729c9516415149716ddc8804b8035f0549bfde94
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 14:29:52 2011 +0200

    Set default allocation scope on computer.

    By default, only its administrator can allocate service on it.

commit 72f5c606e4be095199fdc33fd4c786c6c4ae7947
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 14:23:45 2011 +0200

    Change sale trade condition roles based on their relation, in order to make them viewable to other members.

commit d1d5cb4d23c1abd74cb0ea189d013b4f95277b6b
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 12:02:39 2011 +0200

    Allow to edit the computer allocation scope and friends list.

commit 797d1731582097c0501389e29afcc22bfb5030a0
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 11:16:18 2011 +0200

    Only partitions belonging to computer which is open are free.

commit 6b0f63df8dc4b594cad8de4c7c4cb73dc25bf9d9
Author: Łukasz Nowak <luke@nexedi.com>
Date:   Thu Oct 27 10:26:00 2011 +0200

    Follow changes in slap library.

    First request is not returning the whole object, so second one have to be done.

    In some places redo a logic a bit in order to follow new way of slap library
    usage.

commit 77bbd4dc553f3bead251a35dd029412e30c5919d
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 10:36:48 2011 +0200

    The supply trade condition is created with the instance setup service.

commit 90b31bf9458d1b522fa9995bc7e0d3336a4b7e1d
Author: Romain Courteaud <romain@nexedi.com>
Date:   Thu Oct 27 10:00:21 2011 +0200

    Create a default sale trade condition to restrict computer usage to only its administrator by default

commit 015230d8889d944fac0b4784e3b4ea40a76e8d7f
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Oct 26 17:15:02 2011 +0200

    Remove computer access on trade condition by default

commit 9163efca54c0579ba284ddbf00d2be51eb8e4ccc
Author: Romain Courteaud <romain@nexedi.com>
Date:   Wed Oct 26 13:53:33 2011 +0200

    Restrict access to computers.
parent 0737bcf0
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>action_type/object_view</string>
</tuple>
</value>
</item>
<item>
<key> <string>category</string> </key>
<value> <string>object_view</string> </value>
</item>
<item>
<key> <string>condition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>unfiltered_tracking_list</string> </value>
</item>
<item>
<key> <string>permissions</string> </key>
<value>
<tuple>
<string>View</string>
</tuple>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Action Information</string> </value>
</item>
<item>
<key> <string>priority</string> </key>
<value> <float>2.0</float> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Item Tracking</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Expression" module="Products.CMFCore.Expression"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>text</string> </key>
<value> <string>string:${object_url}/Item_viewTrackingList?current:int=0</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -50,10 +50,34 @@
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>computer = context.getParentValue()\n
if computer.getPortalType() != \'Computer\':\n
computer = computer.getParentValue()\n
return computer.Computer_getSoftwareReleaseUrlStringList([\'stopped\'])\n
<value> <string>slap_state = context.getSlapState()\n
portal = context.getPortalObject()\n
portal_preferences = portal.portal_preferences\n
\n
if slap_state == \'free\':\n
computer = context.getParentValue()\n
return computer.Computer_getSoftwareReleaseUrlStringList([\'stopped\'])\n
\n
elif slap_state == \'busy\':\n
\n
# Partition under destruction does not accept new slave\n
try:\n
delivery_line = context.Item_getInstancePackingListLine(service_relative_url=portal_preferences.getPreferredInstanceCleanupResource())\n
except ValueError:\n
pass\n
else:\n
return []\n
\n
try:\n
delivery_line = context.Item_getInstancePackingListLine()\n
except ValueError:\n
pass\n
else:\n
software_release = delivery_line.getAggregateValue(portal_type=\'Software Release\')\n
return [software_release.getUrlString()]\n
\n
else:\n
return []\n
</string> </value>
</item>
<item>
......
......@@ -55,9 +55,9 @@
except ValueError:\n
pass\n
else:\n
software_instance = delivery_line.getAggregateValue(portal_type=\'Software Instance\')\n
software_instance = delivery_line.getAggregateValue(portal_type=[\'Software Instance\', \'Slave Instance\'])\n
if software_instance is not None:\n
return software_instance.getTitle()\n
return software_instance.getSourceReference()\n
return ""\n
</string> </value>
</item>
......
......@@ -50,7 +50,9 @@
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>return context.getPortalObject().portal_workflow.isTransitionPossible(context, \'mark_busy\') and 1 or 0\n
<value> <string>if context.getPortalObject().portal_workflow.isTransitionPossible(context, \'mark_busy\') and context.getParentValue().isMemberOf(\'allocation_scope/open\'):\n
return 1\n
return 0\n
</string> </value>
</item>
<item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
import random\n
open_sale_order = context\n
\n
computer_partition = None\n
query_kw = {\n
\'software_release_url\': software_release_url,\n
\'portal_type\': \'Computer Partition\',\n
}\n
if software_instance_portal_type == "Slave Instance":\n
query_kw[\'free_for_request\'] = 0\n
query_kw[\'software_type\'] = software_type\n
elif software_instance_portal_type == "Software Instance":\n
query_kw[\'free_for_request\'] = 1\n
else:\n
raise NotImplementedError, "Unknown portal type %s" % \\\n
software_instance_portal_type \n
# support SLA\n
if "computer_guid" in filter_kw:\n
query_kw["parent_reference"] = filter_kw["computer_guid"]\n
\n
SQL_WINDOW_SIZE = 50\n
\n
# fetch at mot 50 random Computer Partitions, and check if they are ok\n
isTransitionPossible = open_sale_order.getPortalObject().portal_workflow.isTransitionPossible\n
result_count = open_sale_order.portal_catalog.countResults(**query_kw)[0][0]\n
offset = max(0, result_count-1)\n
if offset >= SQL_WINDOW_SIZE:\n
limit = (random.randint(0, offset), SQL_WINDOW_SIZE)\n
else:\n
limit = (0, SQL_WINDOW_SIZE)\n
\n
for computer_partition_candidate in context.portal_catalog(\n
limit=limit, **query_kw):\n
computer_partition_candidate = computer_partition_candidate.getObject() \n
if software_instance_portal_type == "Software Instance":\n
# Check if the computer partition can be marked as busy\n
if isTransitionPossible(computer_partition_candidate, \'mark_busy\'):\n
computer_partition = computer_partition_candidate\n
computer_partition.markBusy()\n
break\n
elif computer_partition_candidate.getSlapState() == "busy":\n
# Only assign slave instance on busy partition\n
computer_partition = computer_partition_candidate\n
break\n
\n
if computer_partition is None:\n
raise ValueError(\'It was not possible to find free Computer Partition\')\n
\n
# lock computer partition\n
computer_partition.serialize()\n
\n
return computer_partition.getRelativeUrl()\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>software_release_url, software_type, software_instance_portal_type, filter_kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OpenSaleOrder_findPartition</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -82,6 +82,10 @@
<string>reference</string>
<string>Reference</string>
</tuple>
<tuple>
<string>translated_portal_type</string>
<string>Type</string>
</tuple>
<tuple>
<string>source_reference</string>
<string>Software Type</string>
......@@ -113,6 +117,10 @@
<string>reference</string>
<string>Reference</string>
</tuple>
<tuple>
<string>translated_portal_type</string>
<string>Type</string>
</tuple>
</list>
</value>
</item>
......
......@@ -50,48 +50,12 @@
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
from DateTime import DateTime\n
import random\n
\n
def checkSoftwareInstanceIsInstalledOnComputerPartition(software_release,\n
computer_partition):\n
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery\n
resource_relative_url = (\n
portal.portal_preferences.getPreferredInstanceSetupResource(),\n
portal.portal_preferences.getPreferredInstanceHostingResource(),\n
)\n
query = ComplexQuery(Query(aggregate_relative_url=software_release.getRelativeUrl()),\n
Query(aggregate_relative_url=computer_partition.getRelativeUrl()),\n
operator="AND",\n
)\n
sale_packing_list_line_list = portal.portal_catalog(\n
portal_type=\'Sale Packing List Line\',\n
query=query,\n
resource_relative_url=resource_relative_url,\n
limit=1)\n
\n
if len(sale_packing_list_line_list) == 1:\n
resource_relative_url = (\n
portal.portal_preferences.getPreferredInstanceCleanupResource(),\n
)\n
sale_packing_list_line_list = portal.portal_catalog(\n
portal_type=\'Sale Packing List Line\',\n
query=query,\n
resource_relative_url=resource_relative_url,\n
limit=1)\n
if len(sale_packing_list_line_list) == 0:\n
return True\n
return False\n
<value> <string>from DateTime import DateTime\n
\n
portal = context.getPortalObject()\n
software_instance = state_change[\'object\']\n
software_release_url_string = state_change.kwargs[\'software_release\']\n
hosting_subscription_uid = state_change.kwargs[\'hosting_subscription_uid\']\n
software_type = state_change.kwargs["software_type"]\n
tag = state_change.kwargs[\'tag\']\n
filter_kw = software_instance.getSlaXmlAsDict()\n
\n
# Assertion: No packing list line should be related to this software instance\n
packing_list_line = software_instance.getAggregateRelatedValue(portal_type=\'Sale Packing List Line\')\n
......@@ -101,55 +65,6 @@ if packing_list_line is not None:\n
# Find a free computer partition. This means:\n
# Computer Partition which doesn\'t have non delivered sale packing list related\n
\n
SQL_WINDOW_SIZE = 50\n
\n
computer_partition = None\n
query_kw = {\n
\'software_release_url\': software_release_url_string,\n
\'portal_type\': \'Computer Partition\',\n
\'free_for_request\': 1,\n
}\n
\n
if software_instance.getPortalType() == "Slave Instance":\n
query_kw[\'free_for_request\'] = 0\n
\n
# support SLA\n
if "computer_guid" in filter_kw:\n
query_kw["parent_reference"] = filter_kw["computer_guid"]\n
\n
# fetch at mot 50 random Computer Partitions, and check if they are ok\n
isTransitionPossible = software_instance.getPortalObject().portal_workflow.isTransitionPossible\n
result_count = software_instance.portal_catalog.countResults(**query_kw)[0][0]\n
offset = max(0, result_count-1)\n
if offset >= SQL_WINDOW_SIZE:\n
limit = (random.randint(0, offset), SQL_WINDOW_SIZE)\n
else:\n
limit = (0, SQL_WINDOW_SIZE)\n
\n
software_release = context.portal_catalog.getResultValue(\n
portal_type=\'Software Release\',\n
url_string=software_release_url_string)\n
\n
for computer_partition_candidate in software_instance.portal_catalog(\n
limit=limit, **query_kw):\n
computer_partition_candidate = computer_partition_candidate.getObject()\n
# Check if the computer partition can be marked as busy (done by an interaction workflow on sale packing list level)\n
software_instance_portal_type = software_instance.getPortalType()\n
if isTransitionPossible(computer_partition_candidate, \'mark_busy\') and \\\n
software_instance_portal_type == "Software Instance":\n
computer_partition = computer_partition_candidate\n
break\n
elif software_instance_portal_type == "Slave Instance" and \\\n
checkSoftwareInstanceIsInstalledOnComputerPartition(software_release, computer_partition_candidate):\n
computer_partition = computer_partition_candidate\n
break\n
\n
if computer_partition is None:\n
raise ValueError(\'It was not possible to find free Computer Partition\')\n
\n
# lock computer partition\n
computer_partition.serialize()\n
\n
software_release_document = context.portal_catalog.getResultValue(\n
portal_type=\'Software Release\',\n
url_string=software_release_url_string)\n
......@@ -158,6 +73,16 @@ software_release_document = context.portal_catalog.getResultValue(\n
portal = context.getPortalObject()\n
\n
hosting_subscription = software_instance.portal_catalog.getResultValue(uid=hosting_subscription_uid)\n
\n
open_order = portal.portal_catalog.getResultValue(\n
portal_type="Open Sale Order",\n
validation_state="validated")\n
computer_partition_relative_url = open_order.OpenSaleOrder_restrictMethodAsShadowUser(\n
open_order=open_order,\n
callable_object=open_order.OpenSaleOrder_findPartition,\n
argument_list=[software_release_url_string, software_instance.getSourceReference(),\n
software_instance.getPortalType(), software_instance.getSlaXmlAsDict()])\n
\n
sale_packing_list_line = context.HostingSubscription_getInstancePackingListLine(state_change)\n
base_sale_packing_list = sale_packing_list_line.getParentValue()\n
# XXX: SoftwareInstance_createSalePackingList shall be used to create new Sale Packing List\n
......@@ -176,14 +101,13 @@ sale_packing_list = sale_packing_list_module.newContent(\n
sale_packing_list_line = sale_packing_list.newContent(\n
portal_type=\'Sale Packing List Line\',\n
resource=context.portal_preferences.getPreferredInstanceSetupResource(),\n
aggregate_value_list=[software_instance, software_release_document, computer_partition, hosting_subscription]\n
aggregate_list=[software_instance.getRelativeUrl(), software_release_document.getRelativeUrl(), \n
computer_partition_relative_url, hosting_subscription.getRelativeUrl()]\n
)\n
\n
# confirm Sale Packing List\n
sale_packing_list.confirm()\n
]]></string> </value>
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
......
......@@ -3,6 +3,7 @@ Computer | computer_usage
Person | get_certificate
Person | revoke_certificate
Slave Instance | jump_to_software_instance
Slave Instance | unfiltered_tracking_list
Slave Instance | view
Slave Instance | web_view
Software Instance Module | view
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>codification</string> </key>
<value> <string>R-OPENORDER</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>effective_date</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>open_order</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Open Order</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Category" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>role/shadow</string>
</tuple>
</value>
</item>
<item>
<key> <string>codification</string> </key>
<value> <string>R-SHADOW</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>effective_date</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>shadow</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Category</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Shadow</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
82
\ No newline at end of file
84
\ No newline at end of file
......@@ -26,6 +26,40 @@
##############################################################################
from Products.ERP5Security.ERP5GroupManager import ConsistencyError
from AccessControl.SecurityManagement import getSecurityManager, \
setSecurityManager, newSecurityManager
from AccessControl import Unauthorized
def restrictMethodAsShadowUser(self, open_order=None, callable_object=None,
argument_list=None, argument_dict=None):
"""
Restrict the security access of a method to the unaccessible shadow user
associated to the current user.
"""
if argument_list is None:
argument_list = []
if argument_dict is None:
argument_dict = {}
if open_order is None or callable_object is None:
raise TypeError('open_order and callable_object cannot be None')
relative_url = open_order.getRelativeUrl()
if open_order.getPortalType() != 'Open Sale Order':
raise Unauthorized("%s is not an Open Sale Order" % relative_url)
else:
# Check that open order is the validated one for the current user
if open_order.getValidationState() != 'validated':
raise Unauthorized('Open Sale Order %s is not validated.' % relative_url)
acl_users = open_order.getPortalObject().acl_users
# Switch to the shadow user temporarily, so that the behavior would not
# change even if this method is invoked by random users.
sm = getSecurityManager()
newSecurityManager(None, acl_users.getUserById(open_order.getReference()))
try:
return callable_object(*argument_list, **argument_dict)
finally:
# Restore the original user.
setSecurityManager(sm)
def getComputerSecurityCategory(self, base_category_list, user_name,
object, portal_type):
......@@ -82,7 +116,7 @@ def getSoftwareInstanceSecurityCategory(self, base_category_list, user_name,
self.getPortalFutureInventoryStateList() + \
self.getPortalReservedInventoryStateList() + \
self.getPortalTransitInventoryStateList(),
sort_on=(('creation_date', 'DESC'),)
sort_on=(('movement.start_date', 'DESC'),)
)
if current_delivery_line is not None:
hosting_item = current_delivery_line.getAggregateValue(portal_type='Hosting Subscription')
......@@ -94,3 +128,4 @@ def getSoftwareInstanceSecurityCategory(self, base_category_list, user_name,
"with reference %r" % user_name
return category_list
......@@ -3,13 +3,13 @@
<role id='R-COMPUTER'>
<item>Auditor</item>
</role>
<role id='R-INSTANCE'>
<item>Auditor</item>
</role>
<role id='R-MEMBER'>
<item>Auditor</item>
<item>Author</item>
</role>
<role id='R-SHADOW'>
<item>Auditor</item>
</role>
<role id='devel'>
<item>Owner</item>
</role>
......
......@@ -3,15 +3,6 @@
<role id='ERP5TypeTestCase'>
<item>Owner</item>
</role>
<role id='R-COMPUTER'>
<item>Auditor</item>
</role>
<role id='R-INSTANCE'>
<item>Auditor</item>
</role>
<role id='R-MEMBER'>
<item>Auditor</item>
</role>
<role id='test_computer'>
<item>Assignor</item>
</role>
......
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_hr_admin'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_admin'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_customer'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='supergabriel'>
<item>Owner</item>
</role>
<role id='test_vifib_customer_a'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_developer'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_member'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_user_admin'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -6,11 +6,11 @@
<role id='F-SALE_G-COMPANY'>
<item>Assignor</item>
</role>
<role id='romain'>
<item>Owner</item>
</role>
<role id='test_vifib_user_developer'>
<item>Associate</item>
</role>
<role id='zope'>
<item>Owner</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
<local_roles_item>
<local_roles>
<role id='R-COMPUTER'>
<role id='R-INSTANCE'>
<item>Auditor</item>
</role>
<role id='R-MEMBER'>
......
......@@ -3,8 +3,5 @@
<role id='ERP5TypeTestCase'>
<item>Owner</item>
</role>
<role id='R-COMPUTER'>
<item>Auditor</item>
</role>
</local_roles>
</local_roles_item>
\ No newline at end of file
......@@ -89,10 +89,6 @@
<key> <string>id</string> </key>
<value> <string>test_hr_admin</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>HR Administrator</string> </value>
......
......@@ -48,10 +48,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_admin</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>Admin</string> </value>
......
......@@ -94,10 +94,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_customer</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>Customer</string> </value>
......
......@@ -110,10 +110,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_customer_a</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>Vifib Customer A</string> </value>
......
......@@ -94,10 +94,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_developer</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>Developper</string> </value>
......
......@@ -48,10 +48,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_member</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>2</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>Vifib Member</string> </value>
......
......@@ -83,10 +83,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_user_admin</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>User Admin</string> </value>
......
......@@ -94,10 +94,6 @@
<key> <string>id</string> </key>
<value> <string>test_vifib_user_developer</string> </value>
</item>
<item>
<key> <string>last_id</string> </key>
<value> <string>1</string> </value>
</item>
<item>
<key> <string>last_name</string> </key>
<value> <string>User Developer</string> </value>
......
......@@ -4,14 +4,14 @@
<multi_property id='category'>role/computer</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Instance</property>
<multi_property id='category'>role/instance</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor; Author'>
<property id='title'>Member</property>
<multi_property id='category'>role/member</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Shadow</property>
<multi_property id='category'>role/shadow</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Customer of the partition</property>
<property id='condition'>python: here.getSlapState() == "busy"</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByPerson</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Software Instance related by Hosting Subscription</property>
<property id='condition'>python: here.getSlapState() == "busy"</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByHostingSubscription</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<property id='condition'>python: context.getReference("") != ""</property>
<multi_property id='category'>role/computer</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Computer Agent</property>
<property id='description'>Monovalued role</property>
......@@ -12,16 +6,10 @@
<multi_property id='base_category'>source_administration</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Instance</property>
<property id='condition'>python: context.getReference("") != ""</property>
<multi_property id='category'>role/instance</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Member</property>
<property id='condition'>python: context.getReference("") != ""</property>
<multi_property id='category'>role/member</multi_property>
<multi_property id='base_category'>role</multi_property>
<property id='title'>Sale Trade Condition allocation</property>
<property id='condition'>python: here.getAllocationScope('').startswith('open')</property>
<property id='base_category_script'>ComputerType_getSecurityCategoryFromSaleTradeCondition</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Self Computer</property>
......
......@@ -4,6 +4,11 @@
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByComputerPartition</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Customer of the Hosting Subscription</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByPerson</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Related Software Instance Group</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromSelf</property>
......
......@@ -5,4 +5,16 @@
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='base_category'>destination_decision</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Hosting Subscription related by self Lines</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromMovementItemByHostingSubscription</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
<role id='Auditor; Assignor'>
<property id='title'>Vifib Production Manager</property>
<multi_property id='category'>function/production</multi_property>
<multi_property id='category'>group/company</multi_property>
<multi_property id='base_category'>function</multi_property>
<multi_property id='base_category'>group</multi_property>
</role>
</type_roles>
\ No newline at end of file
......@@ -11,6 +11,12 @@
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='base_category'>destination_decision</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Destination Section</property>
<property id='description'>Monovalued role</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Software Instance User become Auditor of Sale Packing List related to Slave Instance</property>
<property id='description'>Monovalued role</property>
......
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>role/computer</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor; Author'>
<property id='title'>Member</property>
<multi_property id='category'>role/member</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Member</property>
<multi_property id='category'>role/instance</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
</type_roles>
\ No newline at end of file
<type_roles>
<role id='Auditor'>
<property id='title'>Computer</property>
<multi_property id='category'>role/computer</multi_property>
<property id='title'>Friends of the trade condition</property>
<property id='condition'>python: (here.getValidationState() == 'validated') and (here.getDestinationSection('') != '')</property>
<property id='base_category_script'>SaleTradeConditionType_getSecurityCategoryFromOpenSaleOrder</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Instance</property>
<property id='condition'>python: (here.getValidationState() == 'validated') and (here.getDestinationSection('') == '')</property>
<multi_property id='category'>role/instance</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Auditor'>
<property id='title'>Member</property>
<property id='condition'>python: (here.getValidationState() == 'validated') and (here.getDestinationSection('') == '')</property>
<multi_property id='category'>role/member</multi_property>
<multi_property id='base_category'>role</multi_property>
</role>
<role id='Assignor'>
<property id='title'>Customer</property>
<property id='title'>Provider of the trade condition</property>
<property id='condition'>python: (here.getValidationState() == 'validated') and (here.getSourceSection('') != '')</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromContent</property>
<multi_property id='base_category'>destination_section</multi_property>
<multi_property id='base_category'>source_section</multi_property>
</role>
</type_roles>
\ No newline at end of file
......@@ -4,8 +4,14 @@
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByComputerPartition</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Customer of the Instance</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByPerson</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Owner become Assignee</property>
<property id='description'>XXX Needed to allow doActionFor while creating the document</property>
<property id='base_category_script'>ERP5Type_acquireSecurityFromOwner</property>
<multi_property id='base_category'>source</multi_property>
</role>
......
......@@ -4,8 +4,14 @@
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByComputerPartition</property>
<multi_property id='base_category'>aggregate</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Customer of the Instance</property>
<property id='base_category_script'>ERP5Type_getSecurityCategoryFromAggregateMovementItemByPerson</property>
<multi_property id='base_category'>destination_section</multi_property>
</role>
<role id='Assignee'>
<property id='title'>Owner become Assignee</property>
<property id='description'>XXX Needed to allow doActionFor while creating the document</property>
<property id='base_category_script'>ERP5Type_acquireSecurityFromOwner</property>
<multi_property id='base_category'>source</multi_property>
</role>
......
......@@ -15,6 +15,10 @@
<type>Open Sale Order</type>
<workflow>local_permission_vifib_interaction_workflow</workflow>
</chain>
<chain>
<type>Open Sale Order Module</type>
<workflow>init_vifib_interaction_workflow</workflow>
</chain>
<chain>
<type>Person</type>
<workflow>local_permission_vifib_interaction_workflow</workflow>
......@@ -47,6 +51,10 @@
<type>Sale Trade Condition</type>
<workflow>local_permission_vifib_interaction_workflow</workflow>
</chain>
<chain>
<type>Sale Trade Condition Module</type>
<workflow>init_vifib_interaction_workflow</workflow>
</chain>
<chain>
<type>Slave Instance</type>
<workflow>local_permission_vifib_interaction_workflow</workflow>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string># XXX For now, this script requires proxy manager\n
\n
# base_category_list : list of category values we need to retrieve\n
# user_name : string obtained from getSecurityManager().getUser().getUserName() [NuxUserGroup]\n
# or from getSecurityManager().getUser().getId() [PluggableAuthService with ERP5GroupManager]\n
# object : object which we want to assign roles to.\n
# portal_type : portal type of object\n
\n
# must always return a list of dicts\n
\n
if obj is None:\n
return []\n
\n
portal = obj.getPortalObject()\n
\n
sale_supply_line_list = portal.portal_catalog(\n
aggregate_relative_url=obj.getRelativeUrl(),\n
portal_type="Sale Supply Line",\n
validation_state="validated")\n
\n
category_list = []\n
public = 0\n
\n
for sale_supply_line in sale_supply_line_list:\n
sale_supply_line = sale_supply_line.getObject()\n
sale_trade_condition = sale_supply_line.getParentValue()\n
if sale_trade_condition.getPortalType() == \'Sale Trade Condition\':\n
\n
person_list = sale_supply_line.getDestinationSectionValueList(portal_type="Person")\n
if person_list:\n
for person in person_list:\n
category_list.extend([x.getReference() for x in person.portal_catalog(\n
portal_type="Open Sale Order",\n
validation_state="validated",\n
destination_decision_relative_url=person.getRelativeUrl())])\n
else:\n
# Global\n
public = 1\n
break\n
\n
if public:\n
return {"Auditor": ["R-SHADOW"]}\n
elif category_list:\n
return {"Auditor": ["SHADOW-%s" % x for x in category_list]}\n
else:\n
return []\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>base_category_list, user_name, obj, portal_type</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ComputerType_getSecurityCategoryFromSaleTradeCondition</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string># XXX For now, this script requires proxy manager\n
\n
# base_category_list : list of category values we need to retrieve\n
# user_name : string obtained from getSecurityManager().getUser().getUserName() [NuxUserGroup]\n
# or from getSecurityManager().getUser().getId() [PluggableAuthService with ERP5GroupManager]\n
# object : object which we want to assign roles to.\n
# portal_type : portal type of object\n
\n
# must always return a list of dicts\n
\n
category_list = []\n
\n
if obj is None:\n
return []\n
\n
if obj.getPortalType() in ["Person", "Software Instance"]:\n
return [{"role": [\'role/open_order\']}]\n
return []\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>base_category_list, user_name, obj, portal_type</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ERP5Type_getSecurityCategoryForPersonSoftwareInstance</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string encoding="cdata"><![CDATA[
# XXX For now, this script requires proxy manager\n
\n
# base_category_list : list of category values we need to retrieve\n
# user_name : string obtained from getSecurityManager().getUser().getUserName() [NuxUserGroup]\n
# or from getSecurityManager().getUser().getId() [PluggableAuthService with ERP5GroupManager]\n
# object : object which we want to assign roles to.\n
# portal_type : portal type of object\n
\n
# must always return a list of dicts\n
\n
category_list = []\n
\n
if obj is None:\n
return []\n
\n
movement_portal_type = "Sale Packing List Line"\n
\n
portal = obj.getPortalObject()\n
\n
security_dict = {}\n
\n
parent_url_list = []\n
for movement in portal.portal_catalog(\n
portal_type=movement_portal_type,\n
aggregate_uid=obj.getUid(),\n
simulation_state=portal.getPortalCurrentInventoryStateList() + portal.getPortalReservedInventoryStateList() + portal.getPortalTransitInventoryStateList(),\n
):\n
item = movement.getDestinationSectionValue(portal_type="Person")\n
if item is not None:\n
parent_url_list.append(item.getRelativeUrl())\n
\n
if len(parent_url_list) > 0:\n
parent_url_list.sort()\n
category_list.append({"destination_section": parent_url_list})\n
return category_list\n
]]></string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>base_category_list, user_name, obj, portal_type</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ERP5Type_getSecurityCategoryFromAggregateMovementItemByPerson</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -66,8 +66,11 @@ if obj is None:\n
return []\n
\n
item_portal_type = "Hosting Subscription"\n
\n
for movement in obj.getMovementList():\n
if obj.getPortalType() == \'Open Sale Order\':\n
movement_list = obj.contentValues(portal_type=\'Open Sale Order Line\')\n
else:\n
movement_list = obj.getMovementList()\n
for movement in movement_list:\n
item = movement.getAggregateValue(portal_type=item_portal_type)\n
if item is not None:\n
category_list.append({"aggregate": [item.getRelativeUrl()]})\n
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string># XXX For now, this script requires proxy manager\n
\n
# base_category_list : list of category values we need to retrieve\n
# user_name : string obtained from getSecurityManager().getUser().getUserName() [NuxUserGroup]\n
# or from getSecurityManager().getUser().getId() [PluggableAuthService with ERP5GroupManager]\n
# object : object which we want to assign roles to.\n
# portal_type : portal type of object\n
\n
# must always return a list of dicts\n
\n
category_list = []\n
\n
if obj is None:\n
return []\n
\n
if obj.getPortalType() == \'Person\':\n
open_sale_order = obj.getDestinationSectionRelatedValue(portal_type=\'Open Sale Order\')\n
if open_sale_order is not None and open_sale_order.getValidationState() == \'validated\':\n
return [{\'aggregate\': open_sale_order.getRelativeUrl()}]\n
\n
if obj.getPortalType() == \'Software Instance\':\n
delivery_line = obj.getAggregateRelatedValue(portal_type=\'Sale Packing List Line\')\n
if delivery_line is not None:\n
hosting_subscription = delivery_line.getAggregateValue(portal_type=\'Hosting Subscription\')\n
if hosting_subscription is not None:\n
open_sale_order_line = hosting_subscription.getAggregateRelatedValue(portal_type=\'Open Sale Order Line\')\n
if open_sale_order_line is not None and open_sale_order_line.getParentValue().getValidationState() == \'validated\':\n
return [{\'aggregate\': open_sale_order_line.getParentValue().getRelativeUrl()}]\n
\n
return []\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>base_category_list, user_name, obj, portal_type</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>ERP5Type_getSecurityCategoryFromRelatedOpenOrder</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -62,7 +62,7 @@ return (\n
# Person security\n
(\'ERP5Type_getSecurityCategoryFromAssignment\', [\'function\', \'group\']),\n
(\'ERP5Type_getSecurityCategoryFromAssignment\', [\'role\']),\n
(\'ERP5Type_getPersonSecurityFromHostingSubscription\', [\'aggregate\']),\n
# (\'ERP5Type_getPersonSecurityFromHostingSubscription\', [\'aggregate\']),\n
\n
# Computer security\n
(\'ERP5Type_getComputerSecurityCategory\', [\'role\']),\n
......@@ -70,6 +70,11 @@ return (\n
# Instance security\n
(\'ERP5Type_getSoftwareInstanceSecurityCategory\', [\'role\']),\n
(\'ERP5Type_getSoftwareInstanceSecurityCategory\', [\'aggregate\']),\n
\n
# Person + Instance additional secutity\n
(\'ERP5Type_getSecurityCategoryForPersonSoftwareInstance\', [\'role\']),\n
(\'ERP5Type_getSecurityCategoryFromRelatedOpenOrder\', [\'aggregate\']),\n
\n
)\n
</string> </value>
</item>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_function</string> </key>
<value> <string>restrictMethodAsShadowUser</string> </value>
</item>
<item>
<key> <string>_module</string> </key>
<value> <string>VifibSecurity</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OpenSaleOrder_restrictMethodAsShadowUser</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string># XXX For now, this script requires proxy manager\n
\n
# base_category_list : list of category values we need to retrieve\n
# user_name : string obtained from getSecurityManager().getUser().getUserName() [NuxUserGroup]\n
# or from getSecurityManager().getUser().getId() [PluggableAuthService with ERP5GroupManager]\n
# object : object which we want to assign roles to.\n
# portal_type : portal type of object\n
\n
# must always return a list of dicts\n
\n
category_list = []\n
\n
if obj is None:\n
return []\n
\n
portal = obj.getPortalObject()\n
person_list = []\n
person_list.extend(obj.getDestinationSectionValueList(portal_type="Person"))\n
\n
for person in person_list:\n
for open_order in portal.portal_catalog(\n
portal_type="Open Sale Order",\n
validation_state="validated",\n
destination_decision_relative_url=person.getRelativeUrl()):\n
category_list.append(open_order)\n
\n
if category_list:\n
return {"Auditor": [x.getReference() for x in category_list]}\n
else:\n
return []\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>base_category_list, user_name, obj, portal_type</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeConditionType_getSecurityCategoryFromOpenSaleOrder</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionWorkflowDefinition" module="Products.ERP5.InteractionWorkflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>creation_guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>init_vifib_interaction_workflow</string> </value>
</item>
<item>
<key> <string>manager_bypass</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Init script Interaction Workflow</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Interaction" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>interactions</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>SaleTradeCondition_newContent</string>
</list>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeCondition_newContent</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>newContent</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Sale Trade Condition Module</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Scripts" module="Products.DCWorkflow.Scripts"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>scripts</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>sale_trade_condition = state_change[\'kwargs\'][\'workflow_method_result\']\n
\n
short_portal_type = "STC"\n
id_group = ("vifib", "reference", short_portal_type)\n
default = 1\n
reference = sale_trade_condition.portal_ids.generateNewId(id_group=id_group,\n
default=default)\n
\n
sale_trade_condition.edit(\n
reference=\'%s_%s\' % (short_portal_type, reference),\n
)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeCondition_newContent</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variables" module="Products.DCWorkflow.Variables"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variables</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Worklists" module="Products.DCWorkflow.Worklists"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>worklists</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>Base_updateAllLocalRoles</string>
</list>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_manipulateContent</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>newContent</string>
<string>manage_afterDelete</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Open Sale Order</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -27,15 +27,15 @@
<item>
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>Base_updateAllLocalRoles</string>
</list>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<tuple/>
<list>
<string>Base_updateAllLocalRoles</string>
</list>
</value>
</item>
<item>
......
......@@ -27,15 +27,16 @@
<item>
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>Base_updateAllLocalRoles</string>
</list>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<tuple/>
<list>
<string>Base_updateAllLocalRoles</string>
<string>SaleTradeCondition_updateComputerLocalRoles</string>
</list>
</value>
</item>
<item>
......@@ -57,6 +58,9 @@
<value>
<list>
<string>_setDestinationSection.*</string>
<string>_setSourceSection.*</string>
<string>validate</string>
<string>invalidate</string>
</list>
</value>
</item>
......
......@@ -62,7 +62,7 @@
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>0</int> </value>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
......@@ -84,7 +84,7 @@
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>0</int> </value>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<list>
<string>Base_updateAllLocalRoles</string>
</list>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Computer_setAllocationScope</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>_setAllocationScope.*</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Computer</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -62,7 +62,7 @@
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>0</int> </value>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<list>
<string>OpenSaleOrder_updateSaleTradeConditionLocalRoles</string>
</list>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OpenSaleOrder_edit</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>_setReference</string>
<string>validate</string>
<string>invalidate</string>
<string>_setDestinationDecision.*</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Open Sale Order</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -62,7 +62,7 @@
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>0</int> </value>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
......@@ -80,7 +80,7 @@
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>0</int> </value>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<list>
<string>SaleTradeCondition_updateDestinationSection</string>
</list>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeCondition_setSubjectList</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>_setSubjectList</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Sale Trade Condition</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>open_sale_order = state_change[\'object\']\n
\n
person = open_sale_order.getDestinationSectionValue()\n
for sale_supply_line in person.portal_catalog(\n
destination_section_relative_url=person.getRelativeUrl(), portal_type="Sale Supply Line", validation_state="validated"):\n
sale_trade_condition = sale_supply_line.getParentValue()\n
if sale_trade_condition.getPortalType() == "Sale Trade Condition":\n
sale_trade_condition.activate(after_path_and_method_id=(open_sale_order.getPath(), (\'immediateReindexObject\', \'recursiveImmediateReindexObject\')),).updateLocalRolesOnSecurityGroups()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>OpenSaleOrder_updateSaleTradeConditionLocalRoles</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -54,10 +54,13 @@
This script updates all local roles on the object. It requires Assignor\n
proxy role since it may be called by owner in draft state.\n
"""\n
portal_type_list = ["Software Instance", "Slave Instance", "Hosting Subscription"]\n
portal_type_list = ["Software Instance", "Slave Instance", "Hosting Subscription", "Computer Partition"]\n
for movement in state_change[\'object\'].getMovementList():\n
tag = "softinssec_%s" % movement.getUid()\n
movement.activate(tag=tag).immediateReindexObject()\n
movement.activate(activity=\'SQLQueue\', tag=tag, after_path_and_method_id=(movement.getPath(),\n
(\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))).serialize()\n
movement.activate(activity=\'SQLQueue\', tag=tag, after_path_and_method_id=(movement.getParentValue().getPath(),\n
(\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))).serialize()\n
for software_instance in movement.getAggregateValueList(portal_type=portal_type_list):\n
software_instance.activate(after_tag=tag).updateLocalRolesOnSecurityGroups()\n
</string> </value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>sale_trade_condition = state_change[\'object\']\n
\n
for sale_supply_line in sale_trade_condition.contentValues(portal_type="Sale Supply Line"):\n
for computer in sale_supply_line.getAggregateValueList(portal_type="Computer"):\n
tag = \'%s_related_document_reindex\' % computer.getPath()\n
computer.activate(activity=\'SQLQueue\', tag=tag, after_path_and_method_id=(sale_trade_condition.getPath(),\n
(\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))\n
).serialize()\n
computer.activate(activity=\'SQLQueue\', tag=tag, after_path_and_method_id=(sale_supply_line.getPath(),\n
(\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))\n
).serialize()\n
computer.activate(activity=\'SQLQueue\', tag=tag, after_path_and_method_id=(computer.getPath(),\n
(\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))\n
).serialize()\n
computer.activate(after_tag=tag).updateLocalRolesOnSecurityGroups()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SaleTradeCondition_updateComputerLocalRoles</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -50,33 +50,36 @@
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>sale_packing_list = state_change[\'object\']\n
<value> <string>sale_trade_condition = state_change[\'object\']\n
portal = sale_trade_condition.getPortalObject()\n
\n
sale_order = sale_packing_list.getCausalityValue(portal_type="Sale Order")\n
if sale_order is None:\n
setup_service_relative_url = sale_packing_list.portal_preferences.getPreferredInstanceSetupResource()\n
subject_list = sale_trade_condition.getSubjectList()\n
person_list = []\n
\n
for sale_packing_list_line in sale_packing_list.contentValues(\n
portal_type="Sale Packing List Line"):\n
if sale_packing_list_line.getResource() == setup_service_relative_url:\n
computer_partition = sale_packing_list_line.getAggregateValue(portal_type=["Computer Partition"])\n
if computer_partition is None:\n
raise ValueError("Sale Packing List Line \'%s\' should have a computer partition aggregated" % sale_packing_list_line.getRelativeUrl())\n
else:\n
# Slave instance do not change state of computer partitions.\n
if sale_packing_list_line.getAggregateValue(portal_type=["Slave Instance"]) is None:\n
# Mark computer partition as busy\n
# This method should be always callable in this step to prevent having 2 packing list related to the same computer partition\n
computer_partition.markBusy()\n
for subject in subject_list:\n
if subject:\n
result_list = portal.portal_catalog(limit=2, validation_state="validated", portal_type="Person", default_email_text=subject)\n
if len(result_list) == 1:\n
person_list.append(result_list[0].getObject())\n
\n
sale_trade_condition.edit(destination_section_value_list=person_list)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SalePackingList_markComputerPartitionBusy</string> </value>
<value> <string>SaleTradeCondition_updateDestinationSection</string> </value>
</item>
</dictionary>
</pickle>
......
237
\ No newline at end of file
288
\ No newline at end of file
......@@ -8,6 +8,7 @@ Campaign
Campaign Module
Computer
Computer Module
Computer Partition
Credential Update Module
Currency
Currency Module
......
......@@ -8,6 +8,7 @@ Campaign
Campaign Module
Computer
Computer Module
Computer Partition
Credential Update Module
Currency
Currency Module
......
Computer | local_permission_vifib_interaction_workflow
Hosting Subscription | local_permission_vifib_interaction_workflow
Internal Packing List | local_permission_vifib_interaction_workflow
Open Sale Order Module | init_vifib_interaction_workflow
Open Sale Order | local_permission_vifib_interaction_workflow
Person | local_permission_vifib_interaction_workflow
Purchase Packing List Line | local_permission_vifib_interaction_workflow
......@@ -9,6 +10,7 @@ Sale Order Line | local_permission_vifib_interaction_workflow
Sale Order | local_permission_vifib_interaction_workflow
Sale Packing List Line | local_permission_vifib_interaction_workflow
Sale Packing List | local_permission_vifib_interaction_workflow
Sale Trade Condition Module | init_vifib_interaction_workflow
Sale Trade Condition | local_permission_vifib_interaction_workflow
Slave Instance | local_permission_vifib_interaction_workflow
Software Instance | local_permission_vifib_interaction_workflow
\ No newline at end of file
init_vifib_interaction_workflow
local_permission_vifib_interaction_workflow
\ No newline at end of file
<catalog_method>
<item key="sql_catalog_object_list" type="int">
<value>1</value>
</item>
</catalog_method>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>allow_simple_one_argument_traversal</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>uid\r\n
security_uid\r\n
getOwnerInfo\r\n
getViewPermissionOwner\r\n
getPath\r\n
getRelativeUrl\r\n
getParentUid\r\n
id\r\n
getDescription\r\n
getTitle\r\n
meta_type\r\n
getPortalType\r\n
getOpportunityState\r\n
getCorporateRegistrationCode\r\n
getEan13Code\r\n
getSimulationState\r\n
getCausalityState\r\n
getInvoiceState\r\n
getValidationState\r\n
getPaymentState\r\n
getEventState\r\n
getImmobilisationState\r\n
getReference\r\n
getGroupingReference\r\n
getSourceReference\r\n
getDestinationReference\r\n
getStringIndex\r\n
getIntIndex\r\n
getFloatIndex\r\n
hasCellContent</string> </value>
</item>
<item>
<key> <string>cache_time_</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>class_file_</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>class_name_</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>connection_hook</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>z_catalog_object_list</string> </value>
</item>
<item>
<key> <string>max_cache_</string> </key>
<value> <int>100</int> </value>
</item>
<item>
<key> <string>max_rows_</string> </key>
<value> <int>1000</int> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
REPLACE INTO\n
catalog\n
(`uid`, `security_uid`, `owner`, `viewable_owner`, `path`, `relative_url`, `parent_uid`, `id`, `description`, `title`, `meta_type`,\n
`portal_type`, `opportunity_state`, `corporate_registration_code`, `ean13_code`, `validation_state`, `simulation_state`,\n
`causality_state`, `invoice_state`, `payment_state`, `event_state`, `immobilisation_state`, `reference`, `grouping_reference`,\n
`source_reference`, `destination_reference`, `string_index`, `int_index`, `float_index`, `has_cell_content`)\n
VALUES\n
<dtml-in prefix="loop" expr="_.range(_.len(uid))">\n
(\n
<dtml-sqlvar expr="uid[loop_item]" type="int">, \n
<dtml-sqlvar expr="security_uid[loop_item]" type="int">,\n
<dtml-sqlvar expr="getOwnerInfo[loop_item][\'id\']" type="string">,\n
<dtml-sqlvar expr="(getViewPermissionOwner[loop_item] is not None) and getViewPermissionOwner[loop_item] or \'\'" type="string" optional>,\n
<dtml-sqlvar expr="getPath[loop_item]" type="string">,\n
<dtml-sqlvar expr="getRelativeUrl[loop_item]" type="string">,\n
<dtml-sqlvar expr="getParentUid[loop_item]" type="int">,\n
<dtml-sqlvar expr="id[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getDescription[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getTitle[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="meta_type[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getPortalType[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getOpportunityState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getCorporateRegistrationCode[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getEan13Code[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getValidationState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getSimulationState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getCausalityState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getInvoiceState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getPaymentState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getEventState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getImmobilisationState[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getReference[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getGroupingReference[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getSourceReference[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getDestinationReference[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getStringIndex[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="getIntIndex[loop_item]" type="int" optional>,\n
<dtml-sqlvar expr="getFloatIndex[loop_item]" type="float" optional>,\n
<dtml-sqlvar expr="hasCellContent[loop_item]" type="int" optional>\n
)\n
<dtml-if sequence-end><dtml-else>,</dtml-if>\n
</dtml-in>\n
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
29
\ No newline at end of file
30
\ No newline at end of file
......@@ -4,6 +4,7 @@ erp5_mysql_innodb/z0_uncatalog_computer_partition
erp5_mysql_innodb/z0_uncatalog_software_instance
erp5_mysql_innodb/z_catalog_computer_partition_list
erp5_mysql_innodb/z_catalog_email_list
erp5_mysql_innodb/z_catalog_object_list
erp5_mysql_innodb/z_catalog_software_instance_list
erp5_mysql_innodb/z_create_computer_partition
erp5_mysql_innodb/z_create_software_instance_tree
......
......@@ -77,10 +77,11 @@ if custom_trade_condition is None:\n
custom_trade_condition = portal.sale_trade_condition_module.newContent(specialise_value=trade_condition,\n
destination_section_uid=order.getDestinationSectionUid(),\n
title="ViFiB Custom Conditions")\n
custom_trade_condition.validate()\n
\n
if order.getSpecialise() != custom_trade_condition.getRelativeUrl():\n
order.setSpecialiseValue(custom_trade_condition, portal_type="Sale Trade Condition")\n
if portal.portal_workflow.isTransitionPossible(custom_trade_condition, \'validate\'):\n
custom_trade_condition.validate()\n
</string> </value>
</item>
<item>
......
......@@ -52,36 +52,6 @@
<key> <string>_body</string> </key>
<value> <string>portal = context.getPortalObject()\n
\n
def checkSoftwareInstanceIsInstalledOnComputerPartition(software_release,\n
computer_partition):\n
from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery\n
resource_relative_url = (\n
portal.portal_preferences.getPreferredInstanceSetupResource(),\n
portal.portal_preferences.getPreferredInstanceHostingResource(),\n
)\n
query = ComplexQuery(Query(aggregate_relative_url=software_release.getRelativeUrl()),\n
Query(aggregate_relative_url=computer_partition.getRelativeUrl()),\n
operator="AND",\n
)\n
sale_packing_list_line_list = portal.portal_catalog(\n
portal_type=\'Sale Packing List Line\',\n
query=query,\n
resource_relative_url=resource_relative_url,\n
limit=1)\n
\n
if len(sale_packing_list_line_list) == 1:\n
resource_relative_url = (\n
portal.portal_preferences.getPreferredInstanceCleanupResource(),\n
)\n
sale_packing_list_line_list = portal.portal_catalog(\n
portal_type=\'Sale Packing List Line\',\n
query=query,\n
resource_relative_url=resource_relative_url,\n
limit=1)\n
if len(sale_packing_list_line_list) == 0:\n
return True\n
return False\n
\n
order = state_change[\'object\']\n
\n
setup_service_relative_url = order.portal_preferences.getPreferredInstanceSetupResource()\n
......@@ -95,47 +65,21 @@ for order_line in order.getMovementList():\n
software_release = order_line.getAggregateValue(portal_type="Software Release")\n
software_instance = order_line.getAggregateValue(portal_type=instance_portal_type_list)\n
\n
computer_partition = None\n
# XXX Duplicated from request method...\n
query_kw = {\n
\'software_release_url\': software_release.getUrlString(),\n
\'portal_type\': \'Computer Partition\',\n
\'free_for_request\': 1,\n
}\n
if software_instance.getPortalType() == "Slave Instance":\n
query_kw[\'free_for_request\'] = 0\n
\n
# support SLA\n
filter_kw = software_instance.getSlaXmlAsDict()\n
if "computer_guid" in filter_kw:\n
query_kw["parent_reference"] = filter_kw["computer_guid"]\n
\n
result_count = software_instance.portal_catalog.countResults(**query_kw)[0][0]\n
offset = max(0, result_count-1)\n
for computer_partition_candidate in portal.portal_catalog(\n
limit=(random.randint(0, offset), 50), **query_kw):\n
computer_partition_candidate = computer_partition_candidate.getObject() \n
# Check if the computer partition can be marked as busy (done by an interaction workflow on sale packing list level)\n
software_instance_portal_type = software_instance.getPortalType()\n
if isTransitionPossible(computer_partition_candidate, \'mark_busy\') and \\\n
software_instance_portal_type == "Software Instance":\n
computer_partition = computer_partition_candidate\n
break\n
elif software_instance_portal_type == "Slave Instance" and \\\n
checkSoftwareInstanceIsInstalledOnComputerPartition(software_release, computer_partition_candidate):\n
computer_partition = computer_partition_candidate\n
break\n
\n
if computer_partition is None:\n
raise ValueError(\'It was not possible to find free Computer Partition\')\n
\n
# lock computer partition\n
computer_partition.serialize()\n
if isTransitionPossible(computer_partition_candidate, \'mark_busy\'):\n
computer_partition.markBusy()\n
\n
order_line.edit(\n
aggregate_list=order_line.getAggregateList()+[computer_partition.getRelativeUrl()])\n
hosting_subscription = order_line.getAggregateValue(portal_type="Hosting Subscription")\n
open_order_line = portal.portal_catalog.getResultValue(\n
portal_type="Open Sale Order Line",\n
validation_state="validated",\n
aggregate_relative_url=hosting_subscription.getRelativeUrl(),\n
destination_section_relative_url=order.getDestinationSection())\n
if open_order_line is not None:\n
open_order = open_order_line.getParentValue()\n
computer_partition_relative_url = open_order.OpenSaleOrder_restrictMethodAsShadowUser(\n
open_order=open_order,\n
callable_object=open_order.OpenSaleOrder_findPartition,\n
argument_list=[software_release.getUrlString(), software_instance.getSourceReference(),\n
software_instance.getPortalType(), software_instance.getSlaXmlAsDict()])\n
order_line.edit(\n
aggregate_list=order_line.getAggregateList()+[computer_partition_relative_url])\n
</string> </value>
</item>
<item>
......
97
\ No newline at end of file
104
\ No newline at end of file
<workflow_chain>
<chain>
<type>Assignment</type>
<workflow>slap_interaction_workflow</workflow>
</chain>
<chain>
<type>Computer</type>
<workflow>computer_slap_interface_workflow, slap_interaction_workflow</workflow>
......
......@@ -10,6 +10,10 @@
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string>Mark Free</string> </value>
......@@ -29,7 +33,7 @@
<item>
<key> <string>guard</string> </key>
<value>
<none/>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
......@@ -55,4 +59,22 @@
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Guard" module="Products.DCWorkflow.Guard"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>roles</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
</tuple>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -10,6 +10,10 @@
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_icon</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string>Mark Inactive</string> </value>
......@@ -29,7 +33,7 @@
<item>
<key> <string>guard</string> </key>
<value>
<none/>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
......@@ -55,4 +59,22 @@
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Guard" module="Products.DCWorkflow.Guard"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>roles</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
</tuple>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
......@@ -51,6 +51,7 @@
<item>
<key> <string>_body</string> </key>
<value> <string>computer = state_change[\'object\']\n
computer.edit(allocation_scope=\'open/personal\')\n
portal = computer.getPortalObject()\n
\n
internal_packing_list_url = context.portal_workflow.getInfoFor(\n
......@@ -62,6 +63,23 @@ internal_packing_list = portal.restrictedTraverse(internal_packing_list_url)\n
# portal.portal_workflow.doActionFor(internal_packing_list, \'deliver_action\')\n
internal_packing_list.deliver()\n
portal.portal_workflow.doActionFor(computer, \'validate_action\')\n
\n
# Create a sale packing to restrict the computer usage by default to only its administrator\n
trade_condition_portal_type = "Sale Trade Condition"\n
person = portal.ERP5Site_getAuthenticatedMemberPersonValue()\n
sale_trade_condition_module = portal.getDefaultModule(trade_condition_portal_type)\n
sale_trade_condition = sale_trade_condition_module.newContent(\n
portal_type=trade_condition_portal_type,\n
destination_section_value=person,\n
source_section_value=person,\n
title="%s (%s) supply condition" % (computer.getTitle(), computer.getReference()),\n
)\n
sale_trade_condition.newContent(\n
portal_type="Sale Supply Line",\n
aggregate_value=computer,\n
resource=portal.portal_preferences.getPreferredInstanceSetupResource(),\n
)\n
sale_trade_condition.validate()\n
</string> </value>
</item>
<item>
......
......@@ -154,14 +154,8 @@ if (request_software_instance is None):\n
wf_id=\'person_slap_interface_workflow\')\n
open_order = portal.restrictedTraverse(open_order_url)\n
else:\n
open_order = portal.open_sale_order_module.newContent(\n
destination_section_uid=person.getUid(),\n
destination_decision_uid=person.getUid(),\n
title="ViFiB Open Order")\n
person.createOpenOrder(open_order_url=open_order.getRelativeUrl())\n
open_order.order()\n
open_order.validate()\n
\n
raise ValueError(\'Person has no open order created\')\n
\n
open_order.newContent(\n
portal_type="Open Sale Order Line",\n
title=software_title,\n
......
......@@ -12,6 +12,16 @@
<tuple/>
</value>
</item>
<item>
<key> <string>creation_guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
......@@ -22,6 +32,14 @@
<key> <string>id</string> </key>
<value> <string>slap_interaction_workflow</string> </value>
</item>
<item>
<key> <string>manager_bypass</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Slap Interaction Workflow</string> </value>
</item>
</dictionary>
</pickle>
</record>
......
......@@ -28,7 +28,7 @@
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>SalePackingList_markComputerPartitionBusy</string>
<string>Assignment_createPersonOpenSaleOrder</string>
</list>
</value>
</item>
......@@ -50,13 +50,13 @@
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SalePackingList_confirm</string> </value>
<value> <string>Assignment_open</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>confirm</string>
<string>open</string>
</list>
</value>
</item>
......@@ -68,7 +68,7 @@
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Sale Packing List</string>
<string>Assignment</string>
</list>
</value>
</item>
......@@ -78,6 +78,10 @@
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<list>
<string>SalePackingList_reindexUnderDestructionComputerPartition</string>
</list>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SalePackingList_changeDestructionState</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>confirm</string>
<string>start</string>
<string>stop</string>
<string>deliver</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<list>
<string>Sale Packing List</string>
</list>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>person = state_change[\'object\'].getParentValue()\n
portal = person.getPortalObject()\n
open_order = portal.portal_catalog.getResultValue(\n
default_destination_section_uid=person.getUid(),\n
portal_type="Open Sale Order",\t \t \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 = portal.open_sale_order_module.newContent(\n
destination_section=person.getRelativeUrl(),\n
destination_decision=person.getRelativeUrl(),\n
title="ViFiB Open Order")\n
person.createOpenOrder(open_order_url=open_order.getRelativeUrl())\n
open_order.order()\n
open_order.validate()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Assignment_createPersonOpenSaleOrder</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery, NegatedQuery\n
\n
current_delivery = state_change[\'object\']\n
portal = current_delivery.getPortalObject()\n
\n
destroy_service_relative_url = portal.portal_preferences.getPreferredInstanceCleanupResource()\n
\n
sale_packing_list_line_list = current_delivery.contentValues(portal_type="Sale Packing List Line")\n
for current_delivery_line in sale_packing_list_line_list:\n
if current_delivery_line.getResource() == destroy_service_relative_url:\n
\n
computer_partition = current_delivery_line.getAggregateValue(portal_type=["Computer Partition"])\n
computer_partition.activate(\n
after_path_and_method_id=(current_delivery.getPath(), (\'immediateReindexObject\', \'recursiveImmediateReindexObject\'))).reindexObject()\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>state_change</string> </value>
</item>
<item>
<key> <string>_proxy_roles</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>SalePackingList_reindexUnderDestructionComputerPartition</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
427
\ No newline at end of file
439
\ No newline at end of file
Assignment | slap_interaction_workflow
Computer Partition | computer_partition_slap_interface_workflow
Computer Partition | slap_interaction_workflow
Computer | computer_slap_interface_workflow
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>computer = context\n
return computer.portal_catalog.getResultValue(\n
portal_type="Sale Supply Line",\n
aggregate_relative_url=computer.getRelativeUrl(),\n
validation_state="validated")\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Computer_getRelatedSaleSupplyLine</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>portal = context.getPortalObject()\n
computer = context\n
\n
computer.edit(\n
allocation_scope=allocation_scope,\n
)\n
\n
sale_supply_line = computer.Computer_getRelatedSaleSupplyLine()\n
sale_trade_condition = sale_supply_line.getParentValue()\n
self_person = portal.ERP5Site_getAuthenticatedMemberPersonValue()\n
self_email = self_person.getDefaultEmailCoordinateText()\n
if allocation_scope == \'open/public\':\n
# reset friends and update in place\n
sale_trade_condition.edit(\n
subject_list=[\'\'],\n
destination_section=None)\n
elif allocation_scope == \'open/personal\':\n
# reset friends to self and update in place\n
sale_trade_condition.edit(\n
subject_list=[self_email],\n
destination_section_value=self_person)\n
else:\n
if self_email not in subject_list:\n
# add self as friend\n
subject_list.append(self_email)\n
sale_trade_condition.edit(\n
subject_list=subject_list)\n
\n
message = context.Base_translateString("Allocation scope updated!")\n
return computer.Base_redirect(keep_items={\'portal_status_message\': message})\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>allocation_scope, subject_list, **kw</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Computer_updateAllocationScope</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5Form" module="Products.ERP5Form.Form"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Computer_updateAllocationScope</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string>multipart/form-data</string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list>
<string>your_allocation_scope</string>
<string>your_subject_list</string>
</list>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Computer_viewAllocationScopeUpdateDialog</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>Computer_viewAllocationScopeUpdateDialog</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_dialog</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Update the allocation scope</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>default</string>
<string>description</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>your_allocation_scope</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>The computer allocation scope</string> </value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_dialog_mode_category</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Allocation Scope</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>python: here.getAllocationScope()</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment