Organizationen (speziell Projekte) können jetzt nach den Mitgliedern gefiltert werden (Ticket #1678).

git-svn-id: https://svn.libreccm.org/ccm/trunk@2157 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2013-05-30 12:24:08 +00:00
parent c3ade037a9
commit 0dab49e03b
9 changed files with 179 additions and 42 deletions

View File

@ -27,6 +27,8 @@ import com.arsdigita.kernel.ACSObject;
object type GenericOrganizationalUnit extends ContentPage {
String[0..1] addendum = cms_organizationalunits.addendum VARCHAR(512);
String[0..1] personsStr = cms_organizationalunits.personsstr CLOB;
reference key (cms_organizationalunits.organizationalunit_id);
}

View File

@ -0,0 +1,22 @@
--
-- Copyright (C) 2013 Jens Pelzetter All Rights Reserved.
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public License
-- as published by the Free Software Foundation; either version 2.1 of
-- the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
-- You should have received a copy of the GNU Lesser General Public
-- License along with this library; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--
-- $Id$
-- adds to personsstr column (used for filtering organization by their members)
ALTER TABLE cms_organizationalunits ADD COLUMN personsstr TEXT;

View File

@ -24,5 +24,6 @@
begin;
\i ../default/upgrade/6.6.7-6.6.8/rename_workspace_to_contentcenter.sql
\i ../default/upgrade/6.6.7-6.6.8/add_personsstr_column.sql
commit;

View File

@ -64,6 +64,9 @@
</version>
<version from="6.6.7" to="6.6.8">
<!-- Rename com.arsdigita.cms.Workspace to com.arsdigita.cms.ContentCenter -->
<!-- Add column to GenericOrganizationalUnit for filtering -->
<script sql="ccm-cms/upgrade/::database::-6.6.7-6.6.8.sql"/>
<!-- Fill the personsstr column -->
<script class="com.arsdigita.cms.upgrade.PersonsStrColumn"/>
</version>
</upgrade>

View File

@ -96,14 +96,14 @@ public final class ContentSectionSetup {
* }
*/
public static ContentSection setupContentSectionAppInstance(String name,
List defaultRoles,
List defaultWorkflows,
Boolean isPubliclyViewable,
String itemResolverClassName,
String templateResolverClassName,
List sectionContentTypes,
Boolean useSectionCategories,
List categoryFileList) {
List defaultRoles,
List defaultWorkflows,
Boolean isPubliclyViewable,
String itemResolverClassName,
String templateResolverClassName,
List sectionContentTypes,
Boolean useSectionCategories,
List categoryFileList) {
s_log.info("Creating content section on /" + name);
@ -179,18 +179,18 @@ public final class ContentSectionSetup {
s_log.info("Granting privilege cms_" + priv);
role.grantPermission(m_section,
PrivilegeDescriptor.get("cms_" + priv));
PrivilegeDescriptor.get("cms_" + priv));
if (priv.equals(SecurityManager.CATEGORY_ADMIN)
|| priv.equals(SecurityManager.CATEGORIZE_ITEMS)) {
|| priv.equals(SecurityManager.CATEGORIZE_ITEMS)) {
RootCategoryCollection coll = Category.getRootCategories(m_section);
while (coll.next()) {
if (priv.equals(SecurityManager.CATEGORY_ADMIN)) {
role.grantPermission(coll.getCategory(),
PrivilegeDescriptor.ADMIN);
PrivilegeDescriptor.ADMIN);
} else {
role.grantPermission(coll.getCategory(),
Category.MAP_DESCRIPTOR);
Category.MAP_DESCRIPTOR);
}
}
}
@ -201,11 +201,11 @@ public final class ContentSectionSetup {
// FIXME: String for Site-wide Admininistrators is hardcoded because
// this group in inserted via sql-command during setup
partyColl.filter("Site-wide Administrators");
if(partyColl.next()) {
if (partyColl.next()) {
role.add(partyColl.getParty());
}
partyColl.close();
return role;
}
@ -225,10 +225,10 @@ public final class ContentSectionSetup {
// XXX Shouldn't read permission granted depending on pub=true?
viewers.grantPermission(m_section,
PrivilegeDescriptor.get("cms_read_item"));
PrivilegeDescriptor.get("cms_read_item"));
String email = Boolean.TRUE.equals(pub) ? "public@nullhost"
: "registered@nullhost";
: "registered@nullhost";
Party viewer = retrieveParty(email);
if (viewer == null) {
@ -268,27 +268,27 @@ public final class ContentSectionSetup {
* @param templateResolverClassName
*/
public void registerResolvers(String itemResolverClassName,
String templateResolverClassName) {
String templateResolverClassName) {
if (itemResolverClassName != null
&& itemResolverClassName.length() > 0) {
&& itemResolverClassName.length() > 0) {
m_section.setItemResolverClass(itemResolverClassName);
s_log.info("Registering " + itemResolverClassName
+ " as the item resolver class");
+ " as the item resolver class");
} else {
m_section.setItemResolverClass(ContentSection.getConfig().getDefaultItemResolverClass().getName());
s_log.info("Registering " + itemResolverClassName
+ " as the item resolver class");
+ " as the item resolver class");
}
if (templateResolverClassName != null
&& templateResolverClassName.length() > 0) {
&& templateResolverClassName.length() > 0) {
m_section.setTemplateResolverClass(templateResolverClassName);
s_log.info("Registering " + templateResolverClassName
+ " as the template resolver class");
+ " as the template resolver class");
} else {
m_section.setTemplateResolverClass(ContentSection.getConfig().getDefaultTemplateResolverClass().getName());
s_log.info("Registering " + templateResolverClassName
+ " as the template resolver class");
+ " as the template resolver class");
}
m_section.save();
@ -392,14 +392,14 @@ public final class ContentSectionSetup {
// Save workflow
wf.save();
// Add Workflow to current section
m_section.addWorkflowTemplate(wf);
m_section.save();
// If this workflow should be the default or is the first one
// save it for easy access in registerContentType
if(m_wf == null || (workflow.containsKey("isDefault") && workflow.get("isDefault").equals("true"))) {
if (m_wf == null || (workflow.containsKey("isDefault") && workflow.get("isDefault").equals("true"))) {
m_section.setDefaultWorkflowTemplate(wf);
m_wf = wf;
}
@ -469,12 +469,12 @@ public final class ContentSectionSetup {
m_section.addContentType(type);
s_log.info("Setting the default lifecycle for "
+ name + " to " + m_lcd.getLabel());
+ name + " to " + m_lcd.getLabel());
ContentTypeLifecycleDefinition.updateLifecycleDefinition(m_section, type, m_lcd);
m_lcd.save();
s_log.info("Setting the default workflow template for " + name
+ " to " + m_wf.getLabel());
+ " to " + m_wf.getLabel());
ContentTypeWorkflowTemplate.updateWorkflowTemplate(m_section, type, m_wf);
m_wf.save();
@ -643,7 +643,7 @@ public final class ContentSectionSetup {
@Override
public void startElement(String uri, String local,
String qName, Attributes attrs) {
String qName, Attributes attrs) {
if ("categories".equals(qName)) {
String name = attrs.getValue("name");
if (name == null) {
@ -653,7 +653,7 @@ public final class ContentSectionSetup {
String context = attrs.getValue("context");
Category root = Category.getRootForObject(m_section,
context);
context);
if (root == null) {
root = new Category();
}
@ -662,8 +662,8 @@ public final class ContentSectionSetup {
if (root.isNew()) {
Category.setRootForObject(m_section,
root,
context);
root,
context);
}
m_cats.push(root);
PermissionService.setContext(root, m_section);
@ -705,5 +705,6 @@ public final class ContentSectionSetup {
m_cats.pop();
}
}
} // END private class CategoryHandler
}

View File

@ -46,6 +46,7 @@ public class GenericOrganizationalUnit extends ContentPage {
public final static String ADDENDUM = "addendum";
public final static String CONTACTS = "contacts";
public final static String PERSONS = "persons";
protected final static String PERSONS_STR = "personsStr";
public final static String SUPERIOR_ORGAUNITS = "superiorOrgaunits";
public final static String SUBORDINATE_ORGAUNITS = "subordinateOrgaunits";
public final static String BASE_DATA_OBJECT_TYPE =

View File

@ -3,6 +3,7 @@ package com.arsdigita.cms.contenttypes;
import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.CustomCopy;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.ItemCopier;
import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory;
@ -74,18 +75,45 @@ public class GenericOrganizationalUnitBundle extends ContentBundle {
link.set(GenericOrganizationalUnitPersonCollection.PERSON_ROLE, role);
link.set(GenericOrganizationalUnitPersonCollection.STATUS, status);
link.save();
updatePersonsStr();
}
public void removePerson(final GenericPerson person) {
Assert.exists(person, GenericPerson.class);
remove(PERSONS, person.getContentBundle());
updatePersonsStr();
}
public boolean hasPersons() {
return !getPersons().isEmpty();
}
protected void updatePersonsStr() {
final GenericOrganizationalUnitPersonCollection persons = getPersons();
final StringBuilder builder = new StringBuilder();
while(persons.next()) {
if (builder.length() > 0) {
builder.append("; ");
}
builder.append(persons.getSurname());
builder.append(", ");
builder.append(persons.getGivenName());
}
final String personsStr = builder.toString();
final ItemCollection instances = getInstances();
GenericOrganizationalUnit orgaunit;
while(instances.next()) {
orgaunit = (GenericOrganizationalUnit) instances.getDomainObject();
orgaunit.set(GenericOrganizationalUnit.PERSONS_STR, personsStr);
}
}
public GenericOrganizationalUnitContactCollection getContacts() {
return new GenericOrganizationalUnitContactCollection((DataCollection) get(
CONTACTS));

View File

@ -18,27 +18,20 @@
*/
package com.arsdigita.cms.upgrade;
import com.arsdigita.cms.ContentSection;
import com.arsdigita.cms.ContentType;
import com.arsdigita.cms.ContentTypeCollection;
import com.arsdigita.cms.ContentTypeLifecycleDefinition;
import com.arsdigita.cms.ContentTypeWorkflowTemplate;
import com.arsdigita.cms.contenttypes.XMLContentTypeHandler;
import com.arsdigita.cms.lifecycle.LifecycleDefinition;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import org.apache.commons.cli.CommandLine;
import org.apache.log4j.Logger;
import com.arsdigita.util.cmd.Program;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext;
import com.arsdigita.workflow.simple.WorkflowTemplate;
import com.arsdigita.util.cmd.Program;
import com.arsdigita.xml.XML;
import java.math.BigDecimal;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.commons.cli.CommandLine;
import org.apache.log4j.Logger;
/**
*

View File

@ -0,0 +1,86 @@
package com.arsdigita.cms.upgrade;
import com.arsdigita.cms.ItemCollection;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnit;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitBundle;
import com.arsdigita.cms.contenttypes.GenericOrganizationalUnitPersonCollection;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.kernel.Kernel;
import com.arsdigita.kernel.KernelExcursion;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataObject;
import com.arsdigita.persistence.Session;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.persistence.TransactionContext;
import com.arsdigita.util.cmd.Program;
import org.apache.commons.cli.CommandLine;
/**
*
* @author Jens Pelzetter <jens@jp-digital.de>
* @version $Id$
*/
public class PersonsStrColumn extends Program {
public PersonsStrColumn() {
super("PersonsStrColumn", "1.0.0", "");
}
public static final void main(final String[] args) {
new PersonsStrColumn().run(args);
}
@Override
protected void doRun(final CommandLine cmdLine) {
new KernelExcursion() {
@Override
protected void excurse() {
setEffectiveParty(Kernel.getSystemParty());
final Session session = SessionManager.getSession();
final TransactionContext transactionContext = session.getTransactionContext();
transactionContext.beginTxn();
final DataCollection orgaUnitBundles = session.retrieve(
GenericOrganizationalUnitBundle.BASE_DATA_OBJECT_TYPE);
while (orgaUnitBundles.next()) {
createPersonsStr(orgaUnitBundles.getDataObject());
}
transactionContext.commitTxn();
}
}.run();
}
public void createPersonsStr(final DataObject dobj) {
final GenericOrganizationalUnitBundle orgaunitBundle =
(GenericOrganizationalUnitBundle) DomainObjectFactory.newInstance(dobj);
final GenericOrganizationalUnitPersonCollection persons = orgaunitBundle.getPersons();
final StringBuilder builder = new StringBuilder();
while (persons.next()) {
if (builder.length() > 0) {
builder.append("; ");
}
builder.append(persons.getSurname());
builder.append(", ");
builder.append(persons.getGivenName());
}
final String personsStr = builder.toString();
final ItemCollection instances = orgaunitBundle.getInstances();
GenericOrganizationalUnit instance;
while (instances.next()) {
instance = (GenericOrganizationalUnit) instances.getDomainObject();
instance.set("personsStr", personsStr);
}
}
}