Merged from branches/0.1

This commit is contained in:
Sam Minnee 2009-05-04 05:03:44 +00:00
parent 6037ec56e5
commit b646a104f1
11 changed files with 239 additions and 187 deletions

View File

@ -13,6 +13,7 @@ Object::add_extension('LeftAndMain', 'LeftAndMainSubsites');
Object::add_extension('LeftAndMain', 'ControllerSubsites'); Object::add_extension('LeftAndMain', 'ControllerSubsites');
Object::add_extension('Group', 'GroupSubsites'); Object::add_extension('Group', 'GroupSubsites');
Object::add_extension('Member', 'MemberSubsites');
Object::add_extension('File', 'FileSubsites'); Object::add_extension('File', 'FileSubsites');
// Backwards compatibility with SilverStripe 2.2 // Backwards compatibility with SilverStripe 2.2

View File

@ -34,9 +34,9 @@ class FileSubsites extends DataObjectDecorator {
if($sites)$fields->addFieldToTab('Root.Details', new DropdownField("SubsiteID", "Subsite", $sites->toDropdownMap('ID', 'Title', "(Public)"))); if($sites)$fields->addFieldToTab('Root.Details', new DropdownField("SubsiteID", "Subsite", $sites->toDropdownMap('ID', 'Title', "(Public)")));
} }
if($this->owner->SubsiteID == 0&&!Permission::check('EDIT_PERMISSIONS')){ if($this->owner->SubsiteID == 0 && !Permission::check('EDIT_PERMISSIONS') && !Permission::check('SUBSITE_ASSETS_EDIT')){
$fields->removeFieldFromTab("Root", "Upload"); $fields->removeFieldFromTab("Root", "Upload");
$fields->transform(new ReadonlyTransformation()); $fields = $fields->transform(new ReadonlyTransformation());
} }
} }
@ -64,6 +64,11 @@ class FileSubsites extends DataObjectDecorator {
if(!$this->owner->ID && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID(); if(!$this->owner->ID && !$this->owner->SubsiteID) $this->owner->SubsiteID = Subsite::currentSubsiteID();
} }
function onAfterUpload() {
$this->owner->SubsiteID = Subsite::currentSubsiteID();
$this->owner->write();
}
function alternateCanEdit() { function alternateCanEdit() {
// Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group // Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group
$subsiteID = Session::get('SubsiteID'); $subsiteID = Session::get('SubsiteID');

View File

@ -18,20 +18,35 @@ class GroupSubsites extends DataObjectDecorator {
} }
function updateCMSFields(&$fields) { function updateCMSFields(&$fields) {
if( $this->owner->SubsiteID == 0 || $this->owner->canEdit() ){
$subsites = DataObject::get('Subsite'); $subsites = DataObject::get('Subsite');
if ( $subsites && $subsites->exists() ) {
$oldSubsiteID = Session::get('SubsiteID');
foreach( $subsites as $subsite ) {
Subsite::changeSubsite($subsite->ID);
if ( !Permission::check('CL_Admin') ) { $subsites->remove( $subsite ) ; }
}
Subsite::changeSubsite($oldSubsiteID);
$tab = $fields->findOrMakeTab( $tab = $fields->findOrMakeTab(
'Root.Subsites', 'Root.Subsites',
_t('GroupSubsites.SECURITYTABTITLE', 'Subsites') _t('GroupSubsites.SECURITYTABTITLE', 'Subsites')
); );
$tab->push(new DropdownField(
$dropdown = new DropdownField(
'SubsiteID', 'SubsiteID',
_t('GroupSubsites.SECURITYACCESS', 'Limit CMS access to subsites', PR_MEDIUM, 'Dropdown listing existing subsites which this group has access to'), _t('GroupSubsites.SECURITYACCESS', 'Limit CMS access to subsites', PR_MEDIUM, 'Dropdown listing existing subsites which this group has access to'),
($subsites) ? $subsites->toDropDownMap() : null, $subsites->toDropDownMap(),
null, null,
null, null,
'' ''
)); );
if ( $subsites->Count() == 1 ) $dropdown = $dropdown->transform(new ReadonlyTransformation()) ;
$tab->push($dropdown) ;
}
}
} }
/** /**
@ -78,14 +93,13 @@ class GroupSubsites extends DataObjectDecorator {
// Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group // Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group
$oldSubsiteID = Session::get('SubsiteID'); $oldSubsiteID = Session::get('SubsiteID');
Session::set('SubsiteID', $this->owner->SubsiteID); Subsite::changeSubsite($this->owner->SubsiteID) ;
$access = Permission::check('CMS_ACCESS_SecurityAdmin'); $access = Permission::check('CMS_ACCESS_SecurityAdmin');
Session::set('SubsiteID', $oldSubsiteID); Subsite::changeSubsite($oldSubsiteID) ;
return $access; return $access;
} }
/** /**
* Create a duplicate of this group and save it to another subsite. * Create a duplicate of this group and save it to another subsite.
* The group and permissions will be duplicated, but not the members. * The group and permissions will be duplicated, but not the members.

View File

@ -78,6 +78,9 @@ class LeftAndMainSubsites extends Extension {
$mainSiteTitle = "Main site"; $mainSiteTitle = "Main site";
} }
break; break;
default:
$mainSiteTitle = "Main site";
break;
} }
if($mainSiteTitle && Subsite::hasMainSitePermission(Member::currentUser(), array('CMS_ACCESS_' . $this->owner->class, 'ADMIN'))) if($mainSiteTitle && Subsite::hasMainSitePermission(Member::currentUser(), array('CMS_ACCESS_' . $this->owner->class, 'ADMIN')))

20
code/MemberSubsites.php Normal file
View File

@ -0,0 +1,20 @@
<?php
/**
* Extension for the Group object to add subsites support
*
* @package subsites
*/
class MemberSubsites extends DataObjectDecorator {
/* Only allow adding to groups we can edit */
public function saveGroups( $groups ) {
$groups = explode( ',', $groups ) ;
$filtered = array() ;
foreach( $groups as $groupID ) {
$group = DataObject::get_by_id('Group', $groupID) ;
if ( $group && $group->canEdit() ) $filtered[] = $groupID ;
}
$this->owner->Groups()->setByIDList( $filtered ) ;
}
}

View File

@ -282,6 +282,10 @@ JS;
else $subsiteID = $subsite; else $subsiteID = $subsite;
Session::set('SubsiteID', $subsiteID); Session::set('SubsiteID', $subsiteID);
// And clear caches
self::$cached_subsite = NULL ;
Permission::flush_permission_cache() ;
} }
/** /**
@ -491,6 +495,7 @@ JS;
return array( return array(
'SUBSITE_EDIT' => 'Edit Sub-site Details', 'SUBSITE_EDIT' => 'Edit Sub-site Details',
'SUBSITE_ACCESS_ALL' => 'Access all subsites', 'SUBSITE_ACCESS_ALL' => 'Access all subsites',
'SUBSITE_ASSETS_EDIT' => 'Edit Sub-site Assets Admin'
); );
} }
@ -540,7 +545,7 @@ class Subsite_Template extends Subsite {
while(count($stack) > 0) { while(count($stack) > 0) {
list($sourceParentID, $destParentID) = array_pop($stack); list($sourceParentID, $destParentID) = array_pop($stack);
$children = Versioned::get_by_stage('Page', 'Live', "`ParentID`=$sourceParentID", ''); $children = Versioned::get_by_stage('SiteTree', 'Live', "`ParentID`=$sourceParentID", '');
if($children) { if($children) {
foreach($children as $child) { foreach($children as $child) {

View File

@ -79,7 +79,7 @@ class SubsiteAdmin extends GenericDataAdmin {
'subsite' => 'New site', 'subsite' => 'New site',
'template' => 'New template', 'template' => 'New template',
)), )),
new DropdownField('TemplateID', 'Use template:', $templateArray)//, new DropdownField('TemplateID', 'Copy structure from:', $templateArray)//,
/*new TextField('AdminName', 'Admin name:'), /*new TextField('AdminName', 'Admin name:'),
new EmailField('AdminEmail', 'Admin email:')*/ new EmailField('AdminEmail', 'Admin email:')*/
), ),

View File

@ -1,9 +1,9 @@
<div id="LeftPane"> <div id="LeftPane">
<h2>Create Intranet</h2> <h2>Create Sub-site</h2>
<div id="AddIntranetForm_holder" style="overflow:auto"> <div id="AddIntranetForm_holder" style="overflow:auto">
$AddSubsiteForm $AddSubsiteForm
</div> </div>
<h2>Search for Intranets</h2> <h2>Search for Sub-sites</h2>
<div id="Search_holder" style="overflow: auto;"> <div id="Search_holder" style="overflow: auto;">
<div id="SearchForm_holder" style="overflow:auto"> <div id="SearchForm_holder" style="overflow:auto">
$SearchForm $SearchForm

View File

@ -1,4 +1,4 @@
<? <?php
class SubsiteAdminTest extends SapphireTest { class SubsiteAdminTest extends SapphireTest {
static $fixture_file = 'subsites/tests/SubsiteTest.yml'; static $fixture_file = 'subsites/tests/SubsiteTest.yml';
@ -99,7 +99,7 @@ class SubsiteAdminTest extends SapphireTest {
*/ */
function testMainsiteAdminCanAccessAllSubsites() { function testMainsiteAdminCanAccessAllSubsites() {
$member = $this->objFromFixture('Member', 'admin'); $member = $this->objFromFixture('Member', 'admin');
$member->logIn(); Session::set("loggedInAs", $member->ID);
$cmsMain = new CMSMain(); $cmsMain = new CMSMain();
foreach($cmsMain->Subsites() as $subsite) { foreach($cmsMain->Subsites() as $subsite) {

View File

@ -43,7 +43,7 @@ class SubsiteTest extends SapphireTest {
$this->assertEquals($siteHome->MasterPageID, $tmplHome->ID); $this->assertEquals($siteHome->MasterPageID, $tmplHome->ID);
// Check linking of child pages // Check linking of child pages
$tmplStaff = $this->objFromFixture('Page','staff'); $tmplStaff = $this->objFromFixture('SiteTree','staff');
$siteStaff = DataObject::get_one('SiteTree', "URLSegment = '" . Convert::raw2sql($tmplStaff->URLSegment) . "'"); $siteStaff = DataObject::get_one('SiteTree', "URLSegment = '" . Convert::raw2sql($tmplStaff->URLSegment) . "'");
$this->assertEquals($siteStaff->MasterPageID, $tmplStaff->ID); $this->assertEquals($siteStaff->MasterPageID, $tmplStaff->ID);
@ -77,33 +77,37 @@ class SubsiteTest extends SapphireTest {
$admin = $this->objFromFixture('Member', 'admin'); $admin = $this->objFromFixture('Member', 'admin');
$subsite1member = $this->objFromFixture('Member', 'subsite1member'); $subsite1member = $this->objFromFixture('Member', 'subsite1member');
$subsite2member = $this->objFromFixture('Member', 'subsite2member'); $subsite2member = $this->objFromFixture('Member', 'subsite2member');
$mainpage = $this->objFromFixture('Page', 'home'); $mainpage = $this->objFromFixture('SiteTree', 'home');
$subsite1page = $this->objFromFixture('Page', 'subsite1_home'); $subsite1page = $this->objFromFixture('SiteTree', 'subsite1_home');
$subsite2page = $this->objFromFixture('Page', 'subsite2_home'); $subsite2page = $this->objFromFixture('SiteTree', 'subsite2_home');
$subsite1 = $this->objFromFixture('Subsite_Template', 'subsite1'); $subsite1 = $this->objFromFixture('Subsite_Template', 'subsite1');
$subsite2 = $this->objFromFixture('Subsite_Template', 'subsite2'); $subsite2 = $this->objFromFixture('Subsite_Template', 'subsite2');
Session::set("loggedInAs", $admin->ID);
$this->assertTrue( $this->assertTrue(
$subsite1page->canEdit($admin), (bool)$subsite1page->canEdit(),
'Administrators can edit all subsites' 'Administrators can edit all subsites'
); );
// @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state // @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state
Subsite::changeSubsite($subsite1); Subsite::changeSubsite($subsite1);
Session::set("loggedInAs", $subsite1member->ID);
$this->assertTrue( $this->assertTrue(
$subsite1page->canEdit($subsite1member), (bool)$subsite1page->canEdit(),
'Members can edit pages on a subsite if they are in a group belonging to this subsite' 'Members can edit pages on a subsite if they are in a group belonging to this subsite'
); );
Session::set("loggedInAs", $subsite2member->ID);
$this->assertFalse( $this->assertFalse(
$subsite1page->canEdit($subsite2member), (bool)$subsite1page->canEdit(),
'Members cant edit pages on a subsite if they are not in a group belonging to this subsite' 'Members cant edit pages on a subsite if they are not in a group belonging to this subsite'
); );
// @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state // @todo: Workaround because GroupSubsites->augmentSQL() is relying on session state
Subsite::changeSubsite($subsite2); Subsite::changeSubsite($subsite2);
$this->assertFalse( $this->assertFalse(
$mainpage->canEdit($subsite2member), $mainpage->canEdit(),
'Members cant edit pages on the main site if they are not in a group allowing this' 'Members cant edit pages on the main site if they are not in a group allowing this'
); );

View File

@ -8,7 +8,7 @@ Subsite_Template:
subsite2: subsite2:
Title: Subsite2 Template Title: Subsite2 Template
Subdomain: subsite2 Subdomain: subsite2
Page: SiteTree:
home: home:
Title: Home Title: Home
SubsiteID: =>Subsite_Template.main SubsiteID: =>Subsite_Template.main
@ -17,7 +17,7 @@ Page:
SubsiteID: =>Subsite_Template.main SubsiteID: =>Subsite_Template.main
staff: staff:
Title: Staff Title: Staff
ParentID: =>Page.about ParentID: =>SiteTree.about
SubsiteID: =>Subsite_Template.main SubsiteID: =>Subsite_Template.main
contact: contact:
Title: Contact Us Title: Contact Us
@ -34,28 +34,28 @@ Page:
subsite2_contactus: subsite2_contactus:
Title: Contact Us (Subsite 2) Title: Contact Us (Subsite 2)
SubsiteID: =>Subsite_Template.subsite2 SubsiteID: =>Subsite_Template.subsite2
Permission:
admin:
Code: ADMIN
accesscmsmain1:
Code: CMS_ACCESS_CMSMain
accesscmsmain2:
Code: CMS_ACCESS_CMSMain
Group: Group:
admin: admin:
Title: Admin Title: Admin
Code: admin Code: admin
Permissions: =>Permission.admin
subsite1_group: subsite1_group:
Title: subsite1_group Title: subsite1_group
Code: subsite1_group Code: subsite1_group
Subsite: =>Subsite_Template.subsite1 SubsiteID: =>Subsite_Template.subsite1
Permissions: =>Permission.accesscmsmain1
subsite2_group: subsite2_group:
Title: subsite2_group Title: subsite2_group
Code: subsite2_group Code: subsite2_group
Subsite: =>Subsite_Template.subsite2 SubsiteID: =>Subsite_Template.subsite2
Permissions: =>Permission.accesscmsmain2 Permission:
admin:
Code: ADMIN
GroupID: =>Group.admin
accesscmsmain1:
Code: CMS_ACCESS_CMSMain
GroupID: =>Group.subsite1_group
accesscmsmain2:
Code: CMS_ACCESS_CMSMain
GroupID: =>Group.subsite2_group
Member: Member:
admin: admin:
FirstName: Admin FirstName: Admin