Commit 86e3bed9 by Juho Salli

Merge branch 'dbindexes' into 'master'

Db indexes

Few low hanging fruits. Comments in the code

See merge request !280
2 parents b10e766e 6660736a
......@@ -23,6 +23,7 @@ import java.util.List;
import javax.ejb.Local;
import fi.codecrew.moya.model.OrgRole;
import fi.codecrew.moya.model.OrgRoleRequest;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
......@@ -45,4 +46,14 @@ public interface OrgRoleBeanLocal {
OrgRole addEventRole(Role eventRole, OrgRole orgRole);
void createRequest(OrgRoleRequest request);
List<OrgRole> getRequestableRoles();
List<OrgRoleRequest> getRequests(boolean showAll);
OrgRoleRequest saveRequest(OrgRoleRequest request);
OrgRoleRequest requestOk(OrgRoleRequest request);
}
......@@ -305,25 +305,36 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE events ADD codecrew_notes TEXT",
});
dbUpdates.add(new String[] {
"update events set end_time = '2010-01-01 00:00:00' where end_time is null"
});
/*
MERGEREQUESTIN TARKASTAJALLE:
Ylempään:
User eikä eventuser, koska muuten teoriassa insomni xiv:n laneventistä voitaisiin sitten viitata eventuseriin, joka liittyy vectorama 2014:sta.
Onko näin hyvä, vai muutanko eventUseriksi, mielipiteitä?
Alempaan:
Meillä on vanhoja tapahtumia joissa ei ole lopetusaikaa -> jotta nämä "näytetään tulevat tapahtumat" -näkymät ois
hyödyllisiä, niin tämä päivitys on kiva. Ilmanlopetusaikaa olevat tulevat listoihin mukaan, koska lopetusaikaa ei pakosti ole vielä rakennusvaiheessa asetettu.
// ... jepjep.. Lefu
dbUpdates.add(new String[] {
"DROP TABLE org_role_requests",
"CREATE TABLE org_role_requests (id SERIAL NOT NULL, handled_notes TEXT, meta json, request_date TIMESTAMPTZ NOT NULL, requeste_handled TIMESTAMPTZ, request_notes TEXT, handler_id INTEGER, requested_role INTEGER NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (id))",
"ALTER TABLE org_role_requests ADD CONSTRAINT FK_org_role_requests_handler_id FOREIGN KEY (handler_id) REFERENCES users (id)",
"ALTER TABLE org_role_requests ADD CONSTRAINT FK_org_role_requests_requested_role FOREIGN KEY (requested_role) REFERENCES org_roles (id)",
"ALTER TABLE org_role_requests ADD CONSTRAINT FK_org_role_requests_user_id FOREIGN KEY (user_id) REFERENCES users (id)",
});
Jos olet erimieltä niin kerro irkissä ennen acceptointia ja teen temppuja :).
*/
// Run some profiling against local database. These were few of the low hanging fruits.
dbUpdates.add(new String[] {
"update events set end_time = '2010-01-01 00:00:00' where end_time is null"
// User searching in admin view (seq scan to index scan)
"CREATE INDEX idx_eventuser_event ON event_users (event_id)",
// Menu subpage parent search.
"CREATE INDEX idx_menu_navigation_parent ON menu_navigation (parent_id)",
// constraint domains case insensitive also at database level.
// Select does not hit this yet because table is so small, but might someday
"CREATE UNIQUE INDEX idx_event_domains_domainname_key_lower ON event_domains (LOWER(domainname))",
// used for placecount calculation in shopping
"CREATE INDEX idx_places_product_id ON places (products_id)",
// Used placeslots calculation in shopping
"CREATE INDEX idx_place_slots_products ON place_slots (product_id, place_id)",
});
}
public BootstrapBean() {
......
......@@ -177,6 +177,9 @@ public class MenuBean implements MenuBeanLocal {
userprofile.setKey("topnavi.profile");
userprofile.addPage(menuitemfacade.findOrCreate("/user/edit"), UserPermission.VIEW_SELF);
userprofile.addPage(menuitemfacade.findOrCreate("/orgrole/requestRole"), UserPermission.REQUEST_ORGROLES);
userprofile.addPage(menuitemfacade.findOrCreate("/orgrole/requestSent"), UserPermission.REQUEST_ORGROLES).setVisible(false);
userprofile.addPage(menuitemfacade.findOrCreate("/user/changePassword"), UserPermission.VIEW_SELF);
userprofile.addPage(menuitemfacade.findOrCreate("/user/gameids"), UserPermission.MODIFY_OWN_GAMEIDS);
userprofile.addPage(menuitemfacade.findOrCreate("/auth/logout"), UserPermission.LOGOUT);
......@@ -232,6 +235,9 @@ public class MenuBean implements MenuBeanLocal {
adminroles.addPage(menuitemfacade.findOrCreate("/role/edit"), null).setVisible(false);
adminroles.addPage(menuitemfacade.findOrCreate("/orgrole/list"), UserPermission.READ_ORGROLES);
adminroles.addPage(menuitemfacade.findOrCreate("/orgrole/create"), UserPermission.WRITE_ORGROLES);
adminroles.addPage(menuitemfacade.findOrCreate("/orgrole/pendingRequests"), UserPermission.WRITE_ORGROLES);
adminroles.addPage(menuitemfacade.findOrCreate("/orgrole/edit"), null).setVisible(false);
adminroles.addPage(menuitemfacade.findOrCreate("/orgrole/editRequest"), null).setVisible(false);
MenuNavigation adminEventCards = adminuser.addPage(null, null);
adminEventCards.setKey("subnavi.cards");
......@@ -243,19 +249,16 @@ public class MenuBean implements MenuBeanLocal {
adminEventCards.addPage(menuitemfacade.findOrCreate("/shop/shopToUser"), null).setVisible(false);
adminEventCards.addPage(menuitemfacade.findOrCreate("/shop/assocToUser"), null).setVisible(false);
MenuNavigation vips = adminuser.addPage(null, null);
vips.setKey("subnavi.vips");
vips.addPage(menuitemfacade.findOrCreate("/vip/viplist"), VipPermission.VIEW);
vips.addPage(menuitemfacade.findOrCreate("/vip/create"), VipPermission.VIEW).setVisible(false);
vips.addPage(menuitemfacade.findOrCreate("/vip/edit"), VipPermission.VIEW).setVisible(false);
MenuNavigation adminAssociation = adminmenu.addPage(null, null);
adminAssociation.setKey("topnavi.adminassoc");
adminAssociation.addPage(menuitemfacade.findOrCreate("/networkassociation/index"), NetworkAssociationPermission.CAN_ADMINISTER_ASSOCIATIONS);
// shop
MenuNavigation adminshop = adminmenu.addPage(null, null);
adminshop.setKey("topnavi.adminshop");
......
......@@ -19,6 +19,7 @@
package fi.codecrew.moya.beans;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
......@@ -33,9 +34,11 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.facade.OrgRoleFacade;
import fi.codecrew.moya.facade.OrgRoleRequestFacade;
import fi.codecrew.moya.facade.RoleFacade;
import fi.codecrew.moya.facade.UserFacade;
import fi.codecrew.moya.model.OrgRole;
import fi.codecrew.moya.model.OrgRoleRequest;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.jpa.GenericFacade;
......@@ -45,7 +48,11 @@ import fi.codecrew.moya.utilities.jpa.GenericFacade;
*/
@Stateless
@LocalBean
@DeclareRoles({ UserPermission.S_READ_ORGROLES, UserPermission.S_WRITE_ORGROLES })
@DeclareRoles({
UserPermission.S_READ_ORGROLES,
UserPermission.S_WRITE_ORGROLES,
UserPermission.S_REQUEST_ORGROLES,
})
public class OrgRoleBean implements OrgRoleBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(OrgRoleBean.class);
......@@ -62,6 +69,10 @@ public class OrgRoleBean implements OrgRoleBeanLocal {
private UserFacade userFacade;
@EJB
private RoleFacade roleFacade;
@EJB
private PermissionBean permbean;
@EJB
private OrgRoleRequestFacade orgrolerequestfacade;
public OrgRoleBean() {
}
......@@ -73,7 +84,7 @@ public class OrgRoleBean implements OrgRoleBeanLocal {
}
@Override
@RolesAllowed({ UserPermission.S_READ_ORGROLES, })
@RolesAllowed({ UserPermission.S_READ_ORGROLES, UserPermission.S_REQUEST_ORGROLES })
public OrgRole find(Integer id) {
return orgRoleFacade.find(id);
}
......@@ -183,4 +194,40 @@ public class OrgRoleBean implements OrgRoleBeanLocal {
return orgRole;
}
@Override
@RolesAllowed({ UserPermission.S_REQUEST_ORGROLES })
public void createRequest(OrgRoleRequest request) {
request.setRequestDate(new Date());
request.setUser(permbean.getCurrentUser().getUser());
orgrolerequestfacade.create(request);
}
@Override
@RolesAllowed({ UserPermission.S_REQUEST_ORGROLES })
public List<OrgRole> getRequestableRoles() {
return orgRoleFacade.findUserRequestable();
}
@Override
@RolesAllowed({ UserPermission.S_WRITE_ORGROLES })
public List<OrgRoleRequest> getRequests(boolean showAll) {
return orgrolerequestfacade.findForOrganiser(showAll);
}
@Override
@RolesAllowed({ UserPermission.S_WRITE_ORGROLES })
public OrgRoleRequest saveRequest(OrgRoleRequest request) {
return orgrolerequestfacade.merge(request);
}
@Override
@RolesAllowed({ UserPermission.S_WRITE_ORGROLES })
public OrgRoleRequest requestOk(OrgRoleRequest request) {
OrgRoleRequest req = orgrolerequestfacade.reload(request);
req.setHandler(permbean.getCurrentUser().getUser());
req.setHandledNotes(request.getHandledNotes());
req.setRequestHandled(new Date());
addRole(req.getUser(), req.getRequestedRole());
return req;
}
}
......@@ -65,6 +65,7 @@ import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.FeedbackFacade;
import fi.codecrew.moya.facade.GameIDFacade;
import fi.codecrew.moya.facade.GroupMembershipFacade;
import fi.codecrew.moya.facade.OrgRoleFacade;
import fi.codecrew.moya.facade.PlaceGroupFacade;
import fi.codecrew.moya.facade.PrintedCardFacade;
import fi.codecrew.moya.facade.ProductFacade;
......@@ -177,6 +178,8 @@ public class UserBean implements UserBeanLocal {
private EventFacade eventfacade;
@EJB
private ProductFacade productFacade;
@EJB
private OrgRoleFacade orgRoleFacade;
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
......@@ -232,7 +235,7 @@ public class UserBean implements UserBeanLocal {
if (u != null)
{
addRecursive(checkedRoles, rolefacade.findForUser(u));
addRecursive(checkedRoles, orgRoleFacade.findRolesForUser(u));
if (permbean.isLoggedIn()) {
// add roles from events default role.
......@@ -465,16 +468,16 @@ public class UserBean implements UserBeanLocal {
return false;
}
@Override
@RolesAllowed(UserPermission.S_MODIFY)
public boolean resetPassword(User user, String password) {
logger.debug("Changing user {} password", user);
user.resetPassword(password);
userFacade.merge(user);
return true;
}
@Override
@RolesAllowed(UserPermission.S_MODIFY)
public boolean resetPassword(User user, String password) {
logger.debug("Changing user {} password", user);
user.resetPassword(password);
userFacade.merge(user);
return true;
}
@Override
@Override
public boolean initPasswordResetForUsername(String username, String url) {
User user = userFacade.findByLogin(username);
return initPasswordReset(user, url);
......@@ -1121,14 +1124,14 @@ public class UserBean implements UserBeanLocal {
return eventUserFacade.findByLogin(username);
}
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public Boolean checkPassword(EventUser eventUser, String password) {
if (eventUser != null) {
return eventUser.checkPassword(password);
}
return null;
}
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public Boolean checkPassword(EventUser eventUser, String password) {
if (eventUser != null) {
return eventUser.checkPassword(password);
}
return null;
}
@Override
@RolesAllowed(SpecialPermission.S_SUPERADMIN)
......@@ -1141,9 +1144,7 @@ public class UserBean implements UserBeanLocal {
return eventUserFacade.findByLogin(username);
}
@Override
@Override
@RolesAllowed(EventPermission.S_MANAGE_EVENT)
public EventUser getUserByAuthcode(String authcode) {
logger.info("getUser({})", authcode);
......@@ -1188,5 +1189,4 @@ public class UserBean implements UserBeanLocal {
return user;
}
}
\ No newline at end of file
......@@ -18,6 +18,8 @@
*/
package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ejb.EJB;
......@@ -25,12 +27,21 @@ import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.model.EventOrganiser;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.OrgRole;
import fi.codecrew.moya.model.OrgRole_;
import fi.codecrew.moya.model.Role;
import fi.codecrew.moya.model.Role_;
import fi.codecrew.moya.model.User;
/**
......@@ -41,7 +52,9 @@ import fi.codecrew.moya.model.User;
public class OrgRoleFacade extends IntegerPkGenericFacade<OrgRole> {
@EJB
EventBeanLocal eventBean;
private EventBeanLocal eventBean;
private static final Logger logger = LoggerFactory.getLogger(OrgRoleFacade.class);
public OrgRoleFacade() {
super(OrgRole.class);
......@@ -87,4 +100,38 @@ public class OrgRoleFacade extends IntegerPkGenericFacade<OrgRole> {
return getEm().createQuery(cq).getResultList();
}
public List<OrgRole> findUserRequestable() {
EventOrganiser org = eventBean.getCurrentEvent().getOrganiser();
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<OrgRole> cq = cb.createQuery(OrgRole.class);
Root<OrgRole> root = cq.from(OrgRole.class);
cq.where(cb.equal(root.get(OrgRole_.eventOrganisation), org),
cb.isTrue(root.get(OrgRole_.userRequestable))
);
return getEm().createQuery(cq).getResultList();
}
public List<Role> findRolesForUser(EventUser u) {
LanEvent event = eventBean.getCurrentEvent();
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<Role> cq = cb.createQuery(Role.class);
Root<OrgRole> root = cq.from(OrgRole.class);
ListJoin<OrgRole, Role> eventRoles = root.join(OrgRole_.eventRoles);
cq.select(eventRoles);
cq.where(
cb.equal(root.get(OrgRole_.eventOrganisation), event.getOrganiser()),
cb.isMember(u.getUser(), root.get(OrgRole_.users)),
cb.equal(eventRoles.get(Role_.event), event)
);
List<Role> ret = getEm().createQuery(cq).getResultList();
return ret;
}
}
/*
* Copyright Codecrew Ry
*
* All rights reserved.
*
* This license applies to any software containing a notice placed by the
* copyright holder. Such software is herein referred to as the Software.
* This license covers modification, distribution and use of the Software.
*
* Any distribution and use in source and binary forms, with or without
* modification is not permitted without explicit written permission from the
* copyright owner.
*
* A non-exclusive royalty-free right is granted to the copyright owner of the
* Software to use, modify and distribute all modifications to the Software in
* future versions of the Software.
*
*/
package fi.codecrew.moya.facade;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.model.OrgRoleRequest;
import fi.codecrew.moya.model.OrgRoleRequest_;
import fi.codecrew.moya.model.OrgRole_;
/**
* Session Bean implementation class OrgRoleFacade
*/
@Stateless
@LocalBean
public class OrgRoleRequestFacade extends IntegerPkGenericFacade<OrgRoleRequest> {
@EJB
EventBeanLocal eventBean;
public OrgRoleRequestFacade() {
super(OrgRoleRequest.class);
}
public List<OrgRoleRequest> findForOrganiser(boolean showAll) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<OrgRoleRequest> cq = cb.createQuery(OrgRoleRequest.class);
Root<OrgRoleRequest> root = cq.from(OrgRoleRequest.class);
ArrayList<Predicate> preds = new ArrayList<>();
preds.add(cb.equal(root.get(OrgRoleRequest_.requestedRole).get(OrgRole_.eventOrganisation), eventBean.getCurrentEvent().getOrganiser()));
if (!showAll) {
preds.add(cb.isNull(root.get(OrgRoleRequest_.requestHandled)));
}
cq.where(preds.toArray(new Predicate[preds.size()]));
return getEm().createQuery(cq).getResultList();
}
}
......@@ -26,7 +26,7 @@ public class OrgRoleRequest extends GenericEntity {
private Date requestHandled;
@ManyToOne()
@JoinColumn(name = "handler_id", nullable = false, updatable = false)
@JoinColumn(name = "handler_id")
private User handler;
@ManyToOne()
......
......@@ -37,11 +37,13 @@ public enum UserPermission implements IAppPermission {
INVITE_USERS, // ("Invite users"),
READ_ORGROLES, // ("View organization roles"),
WRITE_ORGROLES, // ("Modify organization roles"),
REQUEST_ORGROLES,
VITUTTAAKO,
LOGGED_IN_USER,
MODIFY_OWN_GAMEIDS,
VIEW_ALL_GAMEIDS,
HELPPAGE;
HELPPAGE,
;
public static final String S_VIEW_ALL = "USER/VIEW_ALL";
public static final String S_MODIFY = "USER/MODIFY";
......@@ -59,6 +61,7 @@ public enum UserPermission implements IAppPermission {
public static final String S_INVITE_USERS = "USER/INVITE_USERS";
public static final String S_READ_ORGROLES = "USER/READ_ORGROLES";
public static final String S_WRITE_ORGROLES = "USER/WRITE_ORGROLES";
public static final String S_REQUEST_ORGROLES = "USER/REQUEST_ORGROLES";
public static final String S_VITUTTAAKO = "USER/VITUTTAAKO";
public static final String S_MODIFY_OWN_GAMEIDS = "USER/MODIFY_OWN_GAMEIDS";
public static final String S_VIEW_ALL_GAMEIDS = "USER/VIEW_ALL_GAMEIDS";
......
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui"
xmlns:orgrole="http://java.sun.com/jsf/composite/cditools/orgrole">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<ui:param name="thispage" value="page.orgrole.list" />
<f:metadata>
<f:event type="preRenderView" listener="#{orgRolePendingRequestView.initPending()}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['orgrole.pending.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="orgrolelist" styleClass="moya_datatable2">
<p:outputLabel for="showall" />
<p:dataTable border="1" id="user" value="#{orgRolePendingRequestView.requests}" var="req">
<p:column headerText="#{orgRoleRequest.id}" width="20px">
<h:outputText value="#{req.id}" />
</p:column>
<p:column headerText="#{i18n['user.wholeName']}">
<h:link outcome="/useradmin/edit" value="#{req.user.wholeName}">
<f:param name="userid" value="#{req.user.id}" />
</h:link>
</p:column>
<p:column headerText="#{i18n['orgRoleRequest.requestNotes']}">
<h:outputText value="#{req.requestNotes}" />
</p:column>
<p:column>
<h:outputText value="#{req.handledNotes}" />
</p:column>
<p:column headerText="#{i18n['orgRoleRequest.handledNotes']}">
<p:inputTextarea cols="40" rows="2"></p:inputTextarea>
</p:column>
<p:column>
<p:commandButton onerror="alert('#{i18n['orgrolerequest.commanderror']}'); location.reload();" action="#{orgRolePendingRequestView.requestOk}" update=":orgrolelist" />
</p:column>
<p:column>
<p:commandButton onerror="alert('#{i18n['orgrolerequest.commanderror']}'); location.reload();" action="#{orgRolePendingRequestView.discardRequest}" update=":orgrolelist" />
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui"
xmlns:orgrole="http://java.sun.com/jsf/composite/cditools/orgrole">
<h:body>
<ui:composition template="#{sessionHandler.template}">
<ui:param name="thispage" value="page.orgrole.list" />
<f:metadata>
<f:event type="preRenderView" listener="#{orgRolePendingRequestView.initPending()}" />
</f:metadata>
<ui:define name="title">
<h1>#{i18n['orgrole.pending.title']}</h1>
</ui:define>
<ui:define name="content">
<h:form id="orgrolelist" styleClass="moya_datatable2">
<p:selectBooleanCheckbox id="showall" value="#{orgRolePendingRequestView.showAll}" itemLabel="#{i18n['orgRoleRequest.showAll']}">
<p:ajax update=":orgrolelist" listener="#{orgRolePendingRequestView.reloadList()}" />
</p:selectBooleanCheckbox>
<p:dataTable border="1" id="user" value="#{orgRolePendingRequestView.requests}" var="req">
<p:column headerText="#{i18n['orgRoleRequest.id']}" width="20">
<h:link outcome="/orgrole/editRequest" value="#{req.id}">
<f:param value="#{req.id}" name="id" />
</h:link>
</p:column>
<p:column headerText="#{i18n['user.wholeName']}">
<h:link outcome="/useradmin/edit" value="#{req.user.wholeName}">
<f:param name="userid" value="#{req.user.id}" />
</h:link>
</p:column>
<p:column headerText="#{i18n['orgRoleRequest.requestedRole']}">
<h:outputText value="#{req.requestedRole.name}" />
</p:column>
<p:column headerText="#{i18n['orgRoleRequest.requestNotes']}">
<h:outputText value="#{req.requestNotes}" />
</p:column>
<p:column headerText="#{i18n['orgRoleRequest.handledNotes']}">
<p:inputTextarea cols="40" rows="2" value="#{req.handledNotes}"></p:inputTextarea>
</p:column>
<p:column>
<p:commandButton update=":orgrolelist" action="#{orgRolePendingRequestView.requestOk}" value="#{i18n['orgRoleRequest.requestOk']}" />
</p:column>
<p:column>
<p:commandButton update=":orgrolelist" action="#{orgRolePendingRequestView.discardRequest}" value="#{i18n['orgRoleRequest.discardRequest']}" />
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
\ No newline at end of file
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{orgRoleRequestView.initRequest()}" />
</f:metadata>
<ui:define name="content">
<h:form id="orgform">
<h:panelGrid columns="2">
<h:outputLabel for="roleselect" value="#{i18n['orgrolerequest.selectedRole']}" />
<p:selectOneMenu id="roleselect" value="#{orgRoleRequestView.selectedRole}" converter="#{orgRoleConverter}">
<f:selectItems value="#{orgRoleRequestView.orgroles}" var="r" itemLabel="#{r.name}" />
<f:ajax execute="@form" render="orgform:rolecontent" />
</p:selectOneMenu>
<h:outputLabel for="rolecontent" value="#{i18n['orgrolerequest.rolecontent']}" />
<h:outputText id="rolecontent" rendered="#{orgRoleRequestView.selectedRole != null}" value="#{orgRoleRequestView.selectedRole.notes}" />
<h:outputLabel for="requestreason" value="#{i18n['orgrolerequest.requestNotes']}" />
<p:inputTextarea cols="40" rows="10" id="requestreason" value="#{orgRoleRequestView.request.requestNotes}" />
</h:panelGrid>
<h:commandButton ajax="false" id="createrequest" value="#{i18n['orgrolerequest.create']}" action="#{orgRoleRequestView.createRequest()}" />
</h:form>
</ui:define>
</ui:composition>
</html>
\ No newline at end of file
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<ui:composition template="#{sessionHandler.template}">
<ui:define name="content">
<h:outputText value="#{i18n['orgrolerequest.sentSuccessfully']}" />
</ui:define>
</ui:composition>
</html>
\ No newline at end of file
package fi.codecrew.moya.web.cdiview.user;
import java.util.Date;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import fi.codecrew.moya.beans.OrgRoleBeanLocal;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.OrgRoleRequest;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@ConversationScoped
public class OrgRolePendingRequestView extends GenericCDIView {
private static final long serialVersionUID = 9196654356396643701L;
@EJB
private OrgRoleBeanLocal orgrolebean;
private ListDataModel<OrgRoleRequest> requests;
private boolean sendEmail = true;
private String emailMessage = "Hurr";
private boolean showAll = false;
private OrgRoleRequest request;
public void initPending() {
if (super.requirePermissions(UserPermission.WRITE_ORGROLES) && requests == null) {
requests = new ListDataModel<>(orgrolebean.getRequests(isShowAll()));
super.beginConversation();
}
}
public void reloadList() {
requests = null;
request = null;
initPending();
}
public String requestOk() {
request = requests.getRowData();
orgrolebean.requestOk(request);
reloadList();
return null;
}
public String discardRequest() {
request = requests.getRowData();
request.setRequestHandled(new Date());
request.setHandler(permbean.getCurrentUser().getUser());
orgrolebean.saveRequest(request);
reloadList();
return null;
}
public ListDataModel<OrgRoleRequest> getRequests() {
return requests;
}
public void setRequests(ListDataModel<OrgRoleRequest> requests) {
this.requests = requests;
}
public String getEmailMessage() {
return emailMessage;
}
public void setEmailMessage(String emailMessage) {
this.emailMessage = emailMessage;
}
public boolean isSendEmail() {
return sendEmail;
}
public void setSendEmail(boolean sendEmail) {
this.sendEmail = sendEmail;
}
public OrgRoleRequest getRequest() {
return request;
}
public void setRequest(OrgRoleRequest request) {
this.request = request;
}
public boolean isShowAll() {
return showAll;
}
public void setShowAll(boolean showAll) {
this.showAll = showAll;
}
}
package fi.codecrew.moya.web.cdiview.user;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import fi.codecrew.moya.beans.OrgRoleBeanLocal;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.model.OrgRole;
import fi.codecrew.moya.model.OrgRoleRequest;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named
@ConversationScoped
public class OrgRoleRequestView extends GenericCDIView {
private static final long serialVersionUID = 9196654356396643701L;
private OrgRoleRequest request;
@EJB
private OrgRoleBeanLocal orgrolebean;
private List<OrgRole> orgroles;
private OrgRole selectedRole;
public void initRequest() {
if (super.requirePermissions(UserPermission.REQUEST_ORGROLES) && request == null) {
request = new OrgRoleRequest();
orgroles = orgrolebean.getRequestableRoles();
if (!orgroles.isEmpty()) {
selectedRole = orgroles.get(0);
}
super.beginConversation();
}
}
public String createRequest() {
request.setRequestedRole(selectedRole);
orgrolebean.createRequest(request);
request = null;
initRequest();
return "/orgrole/requestSent";
}
public OrgRoleRequest getRequest() {
return request;
}
public void setRequest(OrgRoleRequest request) {
this.request = request;
}
public List<OrgRole> getOrgroles() {
return orgroles;
}
public void setOrgroles(List<OrgRole> orgroles) {
this.orgroles = orgroles;
}
public OrgRole getSelectedRole() {
return selectedRole;
}
public void setSelectedRole(OrgRole selectedRole) {
this.selectedRole = selectedRole;
}
}
......@@ -82,16 +82,16 @@ public class OrgRoleView extends GenericCDIView {
}
public void initForCreate() {
if (requirePermissions(permbean.hasPermission(UserPermission.WRITE_ORGROLES))) {
if (requirePermissions(permbean.hasPermission(UserPermission.WRITE_ORGROLES)) && orgRole == null) {
OrgRole role = new OrgRole();
role.setEventOrganisation(eventBean.getCurrentEvent().getOrganiser());
setOrgRole(role);
orgRole = role;
super.beginConversation();
}
}
public void initForEdit() {
if (requirePermissions(permbean.hasPermission(UserPermission.WRITE_ORGROLES))) {
if (requirePermissions(permbean.hasPermission(UserPermission.WRITE_ORGROLES)) && orgRole == null) {
orgRole = orgRoleBean.find(id);
super.beginConversation();
}
......
/*
* Copyright Codecrew Ry
*
* All rights reserved.
*
* This license applies to any software containing a notice placed by the
* copyright holder. Such software is herein referred to as the Software.
* This license covers modification, distribution and use of the Software.
*
* Any distribution and use in source and binary forms, with or without
* modification is not permitted without explicit written permission from the
* copyright owner.
*
* A non-exclusive royalty-free right is granted to the copyright owner of the
* Software to use, modify and distribute all modifications to the Software in
* future versions of the Software.
*
*/
package fi.codecrew.moya.web.converter;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.utilities.jsf.GenericIntegerEntityConverter;
@Named
@RequestScoped
public class EventMapConverter extends GenericIntegerEntityConverter<EventMap> {
@EJB
private PlaceBeanLocal placebean;
@Override
protected EventMap find(Integer id) {
return placebean.findMap(id);
}
}
......@@ -170,6 +170,7 @@ event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.listFutureEvents.title = Lista tulevista tapahtumista
event.name = Event name
event.nextBillNumber = Initial bill number
event.nodates.message = Lis\u00E4\u00E4 tapahtumaan v\u00E4hint\u00E4\u00E4n aloitusp\u00E4iv\u00E4, lopetusp\u00E4iv\u00E4 sek\u00E4 lipunmyynnin aloitusp\u00E4iv\u00E4.
......@@ -194,7 +195,13 @@ eventmap.uploaderror = Virhe lis\u00E4tess\u00E4 karttapohjaa
eventmap.width = Kartan leveys (px)
eventorg.basicDetails = Perustiedot
eventorg.codecrewDetails = Tapahtuman j\u00E4rjest\u00E4j\u00E4tiedot
eventorg.codecrewNotes = Codecrew -muistiinpanot
eventorg.codecrewResponsible = Codecrewin tukihenkil\u00F6
eventorg.create = Create
eventorg.create.title = Luo tapahtumaj\u00E4rjest\u00E4j\u00E4
eventorg.list.title = Tapahtumaj\u00E4rjest\u00E4j\u00E4t
eventorg.organiserResponsible = J\u00E4rjest\u00E4j\u00E4n vastaava
eventorg.title = Tapahtuman tiedot
foodWave.closeNow = Close now
......@@ -383,6 +390,7 @@ placegroup.showEticket = N\u00E4yt\u00E4 lippu
placegroupview.groupCreator = Tilaaja
placegroupview.owner = Omistaja
placegroupview.placetransferred = Paikka annettu eteenp\u00E4in
placegroupview.reserveForSelf = Valitse paikka itsellesi
placegroupview.toptext = \
placeslot.add = Lis\u00E4\u00E4 placeslot
......@@ -528,11 +536,3 @@ vipProduct.name = Tuote
vipProduct.quantity = Lukum\u00E4\u00E4r\u00E4
yes = Kyll\u00E4
placegroupview.reserveForSelf=Valitse paikka itsellesi
eventorg.codecrewDetails=Tapahtuman j\u00E4rjest\u00E4j\u00E4tiedot
eventorg.codecrewResponsible=Codecrewin tukihenkil\u00F6
eventorg.organiserResponsible=J\u00E4rjest\u00E4j\u00E4n vastaava
eventorg.codecrewNotes=Codecrew -muistiinpanot
eventorg.list.title=Tapahtumaj\u00E4rjest\u00E4j\u00E4t
eventorg.create.title=Luo tapahtumaj\u00E4rjest\u00E4j\u00E4
event.listFutureEvents.title=Lista tulevista tapahtumista
......@@ -379,6 +379,7 @@ event.domains.title = Domain
event.edit = Edit
event.endTime = End time
event.id = Event ID
event.listFutureEvents.title = List of future events
event.name = Event name
event.nextBillNumber = Initial bill number
event.nodates.message = Remember to add event start-date, end-date and ticket's sales start-date.
......@@ -418,13 +419,19 @@ eventorg.billAddress2 = Billing address 2
eventorg.billAddress3 = Billing address 3
eventorg.billAddress4 = Billing address 4
eventorg.bundleCountry = Country bundle
eventorg.codecrewDetails = Event organizer information
eventorg.codecrewNotes = Codecrew notes
eventorg.codecrewResponsible = Codecrew support
eventorg.create = Create
eventorg.create.title = Create eventorganiser
eventorg.createEvent = Create event
eventorg.createevent = Create new event
eventorg.edit = Edit
eventorg.events = Event of the organisation
eventorg.id = Event ID
eventorg.list.title = Event organisers
eventorg.organisation = Organisation name
eventorg.organiserResponsible = Organizer responsible
eventorg.save = Save
eventorg.title = Event details
......@@ -819,6 +826,14 @@ org.hibernate.validator.constraints.Length.message = length must be between {min
org.hibernate.validator.constraints.NotEmpty.message = may not be empty
org.hibernate.validator.constraints.Range.message = must be between {min} and {max}
orgRoleRequest.discardRequest = Discard request
orgRoleRequest.handledNotes = Handling notes
orgRoleRequest.id = ID
orgRoleRequest.requestNotes = Request notes
orgRoleRequest.requestOk = Accept request
orgRoleRequest.requestedRole = Requested role
orgRoleRequest.showAll = Show all request
orgrole.create = Create
orgrole.edit = Edit orgrole
orgrole.list.title = Organization role list
......@@ -826,9 +841,17 @@ orgrole.members.header = Members
orgrole.name = Name
orgrole.orgainisation = Organisation
orgrole.parents = Parent
orgrole.pending.title = Pending organisation role requests
orgrole.save = Save
orgrole.userRequestable = User requestable role
orgrolerequest.commanderror = Error handling request. Please try again.
orgrolerequest.create = Create request
orgrolerequest.requestNotes = Request information
orgrolerequest.rolecontent = Role information
orgrolerequest.selectedRole = Requested role
orgrolerequest.sentSuccessfully = Request sent successfully
page.account.edit.header = Edit account events
page.account.list.header = Account events
page.admin.sendimage.header = Send image
......@@ -977,6 +1000,7 @@ placegroupview.placetransferred = Place is transferred
placegroupview.releasePlace = Release
placegroupview.reservationName = Place
placegroupview.reservationProduct = Ticket
placegroupview.reserveForSelf = Select place for yourself
placegroupview.token = Placecode / user
placeslot.add = Add placeslot
......@@ -1303,6 +1327,8 @@ submenu.neomap.view = Map
submenu.networkassociation.index = Associations
submenu.orgrole.create = Create organisationrole
submenu.orgrole.list = Organisation roles
submenu.orgrole.pendingRequests = Organisation role requests
submenu.orgrole.requestRole = Request role
submenu.pages.create = Create content
submenu.pages.list = List pages
submenu.place.adminGroups = Account places
......@@ -1749,11 +1775,3 @@ voting.create.voteEnd = Voting close
voting.create.voteStart = Voting start
yes = Yes
placegroupview.reserveForSelf=Select place for yourself
eventorg.codecrewDetails=Event organizer information
eventorg.codecrewResponsible=Codecrew support
eventorg.organiserResponsible=Organizer responsible
eventorg.codecrewNotes=Codecrew notes
eventorg.list.title=Event organisers
eventorg.create.title=Create eventorganiser
event.listFutureEvents.title=List of future events
......@@ -381,10 +381,11 @@ event.domains.title = Verkkotunnus
event.edit = Muokkaa
event.endTime = Lopetusp\u00E4iv\u00E4
event.id = Eventin id
event.listFutureEvents.title = Lista tulevista tapahtumista
event.name = Tapahtuman nimi
event.nextBillNumber = Seuraavan laskun numero
event.nodates.message = Lis\u00E4\u00E4 tapahtumaan v\u00E4hint\u00E4\u00E4n aloitusp\u00E4iv\u00E4, lopetusp\u00E4iv\u00E4 sek\u00E4 lipunmyynnin aloitusp\u00E4iv\u00E4.
event.nodates.title = P\u00E4iv\u00E4m\u00E4\u00E4ri\u00E4 puuttuu\!
event.nodates.title = P\u00E4iv\u00E4m\u00E4\u00E4ri\u00E4 puuttuu!
event.privateProperties.title = Yksityiset ominaisuudet
event.properties.title = Ominaisuudet
event.referenceNumberBase = Viitenumeron pohja
......@@ -420,13 +421,19 @@ eventorg.billAddress2 = Laskutusosoite 2
eventorg.billAddress3 = Laskutusosoite 3
eventorg.billAddress4 = Laskutusosoite 4
eventorg.bundleCountry = Kieli-bundle
eventorg.codecrewDetails = Tapahtuman j\u00E4rjest\u00E4j\u00E4tiedot
eventorg.codecrewNotes = Codecrew -muistiinpanot
eventorg.codecrewResponsible = Codecrewin tukihenkil\u00F6
eventorg.create = Luo
eventorg.create.title = Luo tapahtumaj\u00E4rjest\u00E4j\u00E4
eventorg.createEvent = Luo tapahtuma
eventorg.createevent = Luo uusi tapahtuma
eventorg.edit = Muokkaa
eventorg.events = Organisaation tapahtumat
eventorg.id = Tapahtuman ID
eventorg.list.title = Tapahtumaj\u00E4rjest\u00E4j\u00E4t
eventorg.organisation = Organisaation nimi
eventorg.organiserResponsible = J\u00E4rjest\u00E4j\u00E4n vastaava
eventorg.save = Tallenna
eventorg.title = Tapahtuman tiedot
......@@ -830,6 +837,14 @@ org.hibernate.validator.constraints.Length.message = length must be between {min
org.hibernate.validator.constraints.NotEmpty.message = may not be empty
org.hibernate.validator.constraints.Range.message = must be between {min} and {max}
orgRoleRequest.discardRequest = Hylk\u00E4\u00E4 pyynt\u00F6
orgRoleRequest.handledNotes = K\u00E4sittelyhuomiot
orgRoleRequest.id = ID
orgRoleRequest.requestNotes = Hakemuksen tiedot
orgRoleRequest.requestOk = Hyv\u00E4ksy pyynt\u00F6
orgRoleRequest.requestedRole = Haettu rooli
orgRoleRequest.showAll = N\u00E4yt\u00E4 kaikki hakemukset
orgrole.create = Luo
orgrole.edit = Muokkaa j\u00E4rjest\u00E4j\u00E4roolia
orgrole.list.title = Lista organisaation rooleista
......@@ -837,9 +852,17 @@ orgrole.members.header = Ryhm\u00E4n j\u00E4senet
orgrole.name = Nimi
orgrole.orgainisation = Organisaatio
orgrole.parents = Periytyy
orgrole.pending.title = Organisaatioroolihakemukset
orgrole.save = Tallenna
orgrole.userRequestable = K\u00E4ytt\u00E4j\u00E4n haettavissa
orgrolerequest.commanderror = Pyynt\u00F6\u00E4 k\u00E4sitelless\u00E4 tapahtui virhe. Ole hyv\u00E4 ja yrit\u00E4 uudelleen.
orgrolerequest.create = L\u00E4het\u00E4 hakemus
orgrolerequest.requestNotes = Hakemuksen lis\u00E4tiedot
orgrolerequest.rolecontent = Roolin tiedot
orgrolerequest.selectedRole = Haettava rooli
orgrolerequest.sentSuccessfully = Hakemus l\u00E4hetetty onnistuneesti
page.account.edit.header = Muokkaa tilitapahtumia
page.account.list.header = Tilitapahtumat
page.admin.sendimage.header = L\u00E4het\u00E4 kuva
......@@ -962,6 +985,7 @@ placegroupview.placetransferred = Paikka on annettu eteenp\u00E4in.
placegroupview.releasePlace = Vapauta
placegroupview.reservationName = Paikka
placegroupview.reservationProduct = Lippu
placegroupview.reserveForSelf = Valitse paikka itsellesi
placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4
placeslot.add = Lis\u00E4\u00E4 placeslot
......@@ -1285,6 +1309,8 @@ submenu.neomap.view = Paikkakartta
submenu.networkassociation.index = Assosiaatiot
submenu.orgrole.create = Luo j\u00E4rjest\u00E4j\u00E4rooli
submenu.orgrole.list = J\u00E4rjest\u00E4j\u00E4roolit
submenu.orgrole.pendingRequests = Organisaatioroolihakemukset
submenu.orgrole.requestRole = Hae roolia
submenu.pages.create = Luo sis\u00E4lt\u00F6\u00E4
submenu.pages.list = N\u00E4yt\u00E4 sis\u00E4ll\u00F6t
submenu.place.adminGroups = Omat paikat
......@@ -1733,11 +1759,3 @@ voting.create.voteEnd = \u00C4\u00E4nestys kiinni
voting.create.voteStart = \u00C4\u00E4nestys auki
yes = Kyll\u00E4
placegroupview.reserveForSelf=Valitse paikka itsellesi
eventorg.codecrewDetails=Tapahtuman j\u00E4rjest\u00E4j\u00E4tiedot
eventorg.codecrewResponsible=Codecrewin tukihenkil\u00F6
eventorg.organiserResponsible=J\u00E4rjest\u00E4j\u00E4n vastaava
eventorg.codecrewNotes=Codecrew -muistiinpanot
eventorg.list.title=Tapahtumaj\u00E4rjest\u00E4j\u00E4t
eventorg.create.title=Luo tapahtumaj\u00E4rjest\u00E4j\u00E4
event.listFutureEvents.title=Lista tulevista tapahtumista
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!