Commit f943a05c by Tuukka Kivilahti

Merge branch 'accountpermission' into 'master'

Card state filter, and ui fixes

 * Added permission for user to view accountevents.
 * Added filtering by PrintedCard.state
 * Added login for template
 * Update eventusers card after purchase and role modifications.

Kattonu: @tkfftk
2 parents aa1d190a 8662ee4b
......@@ -108,7 +108,7 @@ public class MenuBean implements MenuBeanLocal {
userkauppa.addPage(menuitemfacade.findOrCreate("/bill/list"), BillPermission.VIEW_OWN);
userkauppa.addPage(menuitemfacade.findOrCreate("/bill/edit"), BillPermission.VIEW_OWN).setVisible(false);
userkauppa.addPage(menuitemfacade.findOrCreate("/bill/showBill"), BillPermission.VIEW_OWN).setVisible(false);
userkauppa.addPage(menuitemfacade.findOrCreate("/user/accountEvents"), UserPermission.VIEW_ACCOUNTEVENTS);
userkauppa.addPage(menuitemfacade.findOrCreate("/user/accountEvents"), UserPermission.VIEW_OWN_ACCOUNTEVENTS);
MenuNavigation userPlaces = usermenu.addPage(null, null);
userPlaces.setKey("topnavi.userplaces");
......
......@@ -38,6 +38,7 @@ import fi.codecrew.moya.model.User;
UserPermission.S_MODIFY,
UserPermission.S_MODIFY_ACCOUNTEVENTS,
UserPermission.S_VIEW_ACCOUNTEVENTS,
UserPermission.S_VIEW_OWN_ACCOUNTEVENTS,
UserPermission.S_VIEW_ALL,
UserPermission.S_VIEW_SELF,
UserPermission.S_WRITE_ROLES,
......@@ -53,7 +54,7 @@ import fi.codecrew.moya.model.User;
MapPermission.S_MANAGE_MAPS,
MapPermission.S_MANAGE_OTHERS,
MapPermission.S_BUY_PLACES,
// MapPermission.S_RELEASE_PLACE,
// MapPermission.S_RELEASE_PLACE,
ShopPermission.S_LIST_ALL_PRODUCTS,
ShopPermission.S_LIST_USERPRODUCTS,
......@@ -165,7 +166,8 @@ public class PermissionBean implements PermissionBeanLocal {
}
/**
* Makes sure default user and public role exist and the user is member of the role.
* Makes sure default user and public role exist and the user is member of
* the role.
*/
@Override
public EventUser getAnonEventUser() {
......
......@@ -372,12 +372,17 @@ public class PlaceBean implements PlaceBeanLocal {
private static boolean isUserMember(EventUser user, Product prod) {
boolean ret = false;
for (GroupMembership gm : user.getGroupMemberships()) {
if (prod.equals(gm.getPlaceReservation().getProduct())) {
ret = true;
break;
if (user.getGroupMemberships() != null)
{
for (GroupMembership gm : user.getGroupMemberships()) {
if (gm.getPlaceReservation() != null && prod.equals(gm.getPlaceReservation().getProduct())) {
ret = true;
break;
}
}
}
return ret;
}
......
......@@ -104,6 +104,9 @@ public class ProductBean implements ProductBeanLocal {
@EJB
private DiscountBean discountBean;
@EJB
private CardTemplateBean cardTemplateBean;
private static final Logger logger = LoggerFactory.getLogger(ProductBean.class);
/**
......@@ -350,6 +353,7 @@ public class ProductBean implements ProductBeanLocal {
public AccountEvent createAccountEvent(Product product, BigDecimal quantity, EventUser user) {
user = eventUserFacade.reload(user);
AccountEvent ret = productPBean.createAccountEvent(product, quantity, user, Calendar.getInstance());
cardTemplateBean.checkPrintedCard(user);
return ret;
}
......
......@@ -55,8 +55,12 @@ public class RoleBean implements RoleBeanLocal {
@EJB
private EventUserFacade eventuserfacade;
@EJB
private EventBeanLocal permbean;
@EJB
private CardTemplateBean cardTemplateBean;
// VIEW_ALL pitää olla että voidaan hakea roolien perusteella.
@Override
@RolesAllowed({ UserPermission.S_READ_ROLES, UserPermission.S_VIEW_ALL })
......@@ -185,6 +189,7 @@ public class RoleBean implements RoleBeanLocal {
if (!role.getUsers().contains(eventuser)) {
role.getUsers().add(eventuser);
}
cardTemplateBean.checkPrintedCard(eventuser);
return role;
}
......@@ -203,6 +208,8 @@ public class RoleBean implements RoleBeanLocal {
ur.getUsers().remove(usr);
}
}
cardTemplateBean.checkPrintedCard(usr);
}
@Override
......
......@@ -731,20 +731,6 @@ public class UserBean implements UserBeanLocal {
return userFacade.searchAllUsers(search);
}
// @Override
// public SearchResult<User> getEventUsers(SearchQuery search) {
// if (search.getSearch() == null || search.getSearch().isEmpty())
// {
// throw new
// RuntimeException("You should be using getThisEventsUsers if not searching globally...");
// // return userFacade.searchEventUsers(search);
// } else {
// return userFacade.searchAllUsers(search);
// }
//
// }
//
@Override
@RolesAllowed(UserPermission.S_VIEW_ALL)
public SearchResult<EventUser> getThisEventsUsers(UserSearchQuery searchQuery) {
......@@ -761,9 +747,8 @@ public class UserBean implements UserBeanLocal {
newSearchList.addAll(returnUsers.getResults());
returnUsers = new SearchResult<EventUser>(newSearchList, (long) newSearchList.size());
}
else if (searchQuery.isUsersWithUnusedCodes()) {
} else if (searchQuery.isUsersWithUnusedCodes()) {
List<EventUser> newSearchList = new ArrayList<EventUser>();
List<GroupMembership> groupMembers = new ArrayList<GroupMembership>();
groupMembers = gmfacade.findAllWithoutUser();
......
......@@ -23,6 +23,7 @@ import fi.codecrew.moya.enums.DatabaseHasCompare;
import fi.codecrew.moya.enums.DatabaseValueCompare;
import fi.codecrew.moya.facade.callbacks.EventLimiter;
import fi.codecrew.moya.facade.callbacks.EventUserAccountSaldoPredicate;
import fi.codecrew.moya.facade.callbacks.EventUserCardStateFilter;
import fi.codecrew.moya.facade.callbacks.EventUserPlacegroupPredicate;
import fi.codecrew.moya.facade.callbacks.EventUserRolefilter;
import fi.codecrew.moya.facade.callbacks.EventUserSearchPredicate;
......@@ -147,6 +148,11 @@ public class EventUserFacade extends IntegerPkGenericFacade<EventUser> {
if (query.getFilterRoles() != null && !query.getFilterRoles().isEmpty()) {
callbacks.add(new EventUserRolefilter(query.getFilterRoles()));
}
if (query.getHasCardState() != null && !query.getHasCardState().isEmpty()) {
callbacks.add(new EventUserCardStateFilter(query.getHasCardState()));
}
if (query.getAccountSaldo() != null &&
query.getAccountSaldoCompare() != null &&
!DatabaseValueCompare.NONE.equals(query.getAccountSaldoCompare()))
......
package fi.codecrew.moya.facade.callbacks;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.enums.CardState;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.EventUser_;
import fi.codecrew.moya.model.PrintedCard;
import fi.codecrew.moya.model.PrintedCard_;
import fi.codecrew.moya.utilities.jpa.FacadeCallback;
public class EventUserCardStateFilter implements FacadeCallback<EventUser> {
private final List<CardState> states;
private static final Logger logger = LoggerFactory.getLogger(EventUserCardStateFilter.class);
public EventUserCardStateFilter(List<CardState> statelist) {
this.states = statelist;
}
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, Path<EventUser> root, List<Predicate> predicates) {
if (states != null && !states.isEmpty())
{
for (CardState s : states)
{
logger.info("Statte {}, type {}", s, s.getClass());
}
logger.debug("Requiring states {}", states);
Path<Integer> rootId = root.get(EventUser_.id);
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<PrintedCard> subroot = subq.from(PrintedCard.class);
subq.select(subroot.join(PrintedCard_.user).get(EventUser_.id));
subq.where(subroot.get(PrintedCard_.cardState).in(states));
predicates.add(rootId.in(subq));
}
}
}
......@@ -4,6 +4,7 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import fi.codecrew.moya.enums.CardState;
import fi.codecrew.moya.enums.DatabaseHasCompare;
import fi.codecrew.moya.enums.DatabaseValueCompare;
import fi.codecrew.moya.model.Role;
......@@ -18,6 +19,7 @@ public class UserSearchQuery extends SearchQuery {
private boolean placeAssoc = false;
private boolean usersWithUnusedCodes = false;
private DatabaseHasCompare requireImage = DatabaseHasCompare.NONE;
private List<CardState> hasCardState = new ArrayList<>();
private BigDecimal accountSaldo;
private DatabaseValueCompare accountSaldoCompare = DatabaseValueCompare.NONE;
......@@ -26,6 +28,11 @@ public class UserSearchQuery extends SearchQuery {
super();
}
public CardState[] getCardStates()
{
return CardState.values();
}
public UserSearchQuery(int page, int pagesize, String sort, String search, QuerySortOrder direction) {
super(page, pagesize, sort, search, direction);
}
......@@ -91,4 +98,12 @@ public class UserSearchQuery extends SearchQuery {
this.requireImage = requireImage;
}
public List<CardState> getHasCardState() {
return hasCardState;
}
public void setHasCardState(List<CardState> hasCardState) {
this.hasCardState = hasCardState;
}
}
......@@ -12,6 +12,7 @@ public enum UserPermission implements IAppPermission {
READ_ROLES, // ("View all roles."),
WRITE_ROLES, // ("Modify roles"),
VIEW_ACCOUNTEVENTS, // ("Show other users account events"),
VIEW_OWN_ACCOUNTEVENTS, // ("Show other users account events"),
MODIFY_ACCOUNTEVENTS, // ("Modify Account events"),
ANYUSER, // ("All users have this anyways"),
MANAGE_HTTP_SESSION, // ("Manage http sessions"),
......@@ -32,6 +33,7 @@ public enum UserPermission implements IAppPermission {
public static final String S_READ_ROLES = "USER/READ_ROLES";
public static final String S_WRITE_ROLES = "USER/WRITE_ROLES";
public static final String S_VIEW_ACCOUNTEVENTS = "USER/VIEW_ACCOUNTEVENTS";
public static final String S_VIEW_OWN_ACCOUNTEVENTS = "USER/VIEW_OWN_ACCOUNTEVENTS";
public static final String S_MODIFY_ACCOUNTEVENTS = "USER/MODIFY_ACCOUNTEVENTS";
public static final String S_ANYUSER = "USER/ANYUSER";
public static final String S_MANAGE_HTTP_SESSION = "USER/MANAGE_HTTP_SESSION";
......
......@@ -12,7 +12,7 @@
<p:dataTable styleClass="bordertable" id="usertable" value="#{userSearchView.eventuserModel}" rows="20" paginator="true" lazy="true" var="user">
<p:column headerText="#{i18n['user.nick']}" sortBy="nick">
<p:column headerText="#{i18n['user.nick']}" sortBy="#{user.nick}">
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
<div class="userdata_popup">
<h:panelGrid columns="3">
......@@ -45,16 +45,16 @@
</div>
</p:column>
<p:column sortBy="login" headerText="#{i18n['user.login']}">
<p:column sortBy="#{user.login}" headerText="#{i18n['user.login']}">
<h:outputText value="#{user.login}" />
</p:column>
<p:column headerText="#{i18n['user.firstNames']}" sortBy="firstnames">
<p:column headerText="#{i18n['user.firstNames']}" sortBy="#{user.firstnames}">
<h:outputText value="#{user.firstnames}" />
</p:column>
<p:column headerText="#{i18n['user.lastName']}" sortBy="lastname">
<p:column headerText="#{i18n['user.lastName']}" sortBy="#{user.lastname}">
<h:outputText value="#{user.lastname}" />
</p:column>
<p:column headerText="#{i18n['user.email']}" sortBy="email">
<p:column headerText="#{i18n['user.email']}" sortBy="{user.email}">
<h:outputText value="#{user.email}" />
</p:column>
......
......@@ -11,20 +11,20 @@
<p:dataTable id="user" value="#{userSearchView.userModel}" rows="20" var="wra" paginator="true" lazy="true">
<p:column sortBy="nick" headerText="#{i18n['user.nick']}">
<p:column sortBy="#{wra.user.nick}" headerText="#{i18n['user.nick']}">
<h:outputText value="#{(empty wra.user.nick)?'----':wra.user.nick}" />
</p:column>
<p:column sortBy="login" headerText="#{i18n['user.login']}">
<p:column sortBy="#{wra.user.login}" headerText="#{i18n['user.login']}">
<h:outputText value="#{wra.user.login}" />
</p:column>
<p:column headerText="#{i18n['user.firstNames']}" sortBy="firstnames">
<p:column headerText="#{i18n['user.firstNames']}" sortBy="#{wra.user.firstnames}">
<h:outputText value="#{wra.user.firstnames}" />
</p:column>
<p:column headerText="#{i18n['user.lastName']}" sortBy="lastname">
<p:column headerText="#{i18n['user.lastName']}" sortBy="#{wra.user.lastname}">
<h:outputText value="#{wra.user.lastname}" />
</p:column>
<p:column headerText="#{i18n['user.email']}" sortBy="email">
<p:column headerText="#{i18n['user.email']}" sortBy="#{wra.user.email}">
<h:outputText value="#{wra.user.email}" />
</p:column>
......
......@@ -149,6 +149,10 @@
<h:outputText value="#{i18n['template.loggedInAs']}" />
<br />
<b><h:outputText value="#{sessionHandler.currentUser.nick}" /></b>
<br />
<h:link outcome="/auth/logout">
<h:outputText value="#{i18n['login.logout']}" />
</h:link>
</ui:fragment>
<ui:fragment rendered="#{!sessionHandler.loggedIn}">
<div style="text-align: left; padding: 0.7em;">
......
......@@ -24,26 +24,40 @@
<h:panelGrid columns="2">
<h:panelGroup>
<a onclick="$('#advancedSearch').show(); $(this).hide();"><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a>
<span id="advancedSearch" style="display: none;"> <h:selectBooleanCheckbox id="placeassoc" value="#{userSearchView.searchQuery.placeAssoc}" /> <h:outputLabel for="placeassoc"
value="#{i18n['userlist.placeassoc']}" /> <br /> <h:outputLabel for="saldofilter" value="#{i18n['userlist.saldofilter']}" /> <h:selectOneMenu
value="#{userSearchView.searchQuery.accountSaldoCompare}">
<div id="advancedSearch" style="display: none;">
<h:selectBooleanCheckbox id="placeassoc" value="#{userSearchView.searchQuery.placeAssoc}" />
<h:outputLabel for="placeassoc" value="#{i18n['userlist.placeassoc']}" />
<br />
<h:outputLabel for="saldofilter" value="#{i18n['userlist.saldofilter']}" />
<h:selectOneMenu value="#{userSearchView.searchQuery.accountSaldoCompare}">
<f:selectItems value="#{userSearchView.searchQuery.accountCompareValues}" />
</h:selectOneMenu> <h:inputText value="#{userSearchView.searchQuery.accountSaldo}">
</h:selectOneMenu>
<h:inputText value="#{userSearchView.searchQuery.accountSaldo}">
<f:convertNumber minFractionDigits="0" maxFractionDigits="2" />
</h:inputText> <br /> <h:outputLabel for="rolefilter" value="#{i18n['userlist.rolefilter']}" /> <h:selectManyCheckbox layout="pageDirection" styleClass="nowrap" id="rolefilter"
value="#{userSearchView.searchQuery.filterRoles}" converter="#{roleConverter}">
</h:inputText>
<br />
<h:outputLabel for="rolefilter" value="#{i18n['userlist.rolefilter']}" />
<h:selectManyCheckbox layout="pageDirection" styleClass="nowrap" id="rolefilter" value="#{userSearchView.searchQuery.filterRoles}" converter="#{roleConverter}">
<f:selectItems value="#{roleDataView.roles}" var="r" itemLabel="#{r.name}" />
</h:selectManyCheckbox>
<h:outputLabel for="cardstatusfilter" value="#{i18n['userlist.cardfilter']}" />
<h:selectManyCheckbox layout="pageDirection" styleClass="nowrap" id="cardfilter" value="#{userSearchView.searchQuery.hasCardState}" converter="#{cardStateConverter}">
<f:selectItems value="#{userSearchView.searchQuery.cardStates}" var="r" itemLabel="#{r}" />
</h:selectManyCheckbox>
</span>
</div>
<br />
<h:selectBooleanCheckbox id="onlythisevent" value="#{userSearchView.searchQuery.onlyThisEvent}" />
<h:outputLabel for="onlythisevent" value="#{i18n['userlist.onlythisevent']}" />
<br />
<h:selectBooleanCheckbox id="userswithunusedcodes" value="#{userSearchView.searchQuery.usersWithUnusedCodes}" />
<h:selectBooleanCheckbox id="userswithunusedcodes" value="#{userSearchView.searchQuery.usersWithUnusedCodes}" />
<h:outputLabel for="userswithunusedcodes" value="#{i18n['userlist.usersWithUnusedCodes']}" />
<br />
......
......@@ -100,6 +100,7 @@ bortalApplication.user.READ_ORGROLES = View organization roles
bortalApplication.user.READ_ROLES = View all roles.
bortalApplication.user.VIEW_ACCOUNTEVENTS = Show other users account events
bortalApplication.user.VIEW_ALL = View all users
bortalApplication.user.VIEW_OWN_ACCOUNTEVENTS = View own accountevent
bortalApplication.user.VIEW_SELF = Can view self
bortalApplication.user.VITUTTAAKO = Can send feedback
bortalApplication.user.WRITE_ORGROLES = Modify organization roles
......
......@@ -183,6 +183,7 @@ bortalApplication.user.READ_ORGROLES = View organization roles
bortalApplication.user.READ_ROLES = View all roles.
bortalApplication.user.VIEW_ACCOUNTEVENTS = Show other users account events
bortalApplication.user.VIEW_ALL = View all users
bortalApplication.user.VIEW_OWN_ACCOUNTEVENTS = View own accountevent
bortalApplication.user.VIEW_SELF = Can view self
bortalApplication.user.VITUTTAAKO = Can send feedback
bortalApplication.user.WRITE_ORGROLES = Modify organization roles
......
......@@ -185,6 +185,7 @@ bortalApplication.user.READ_ORGROLES = Saa n\u00E4hd\u00E4 j\u00E4r
bortalApplication.user.READ_ROLES = Saa n\u00E4hd\u00E4 kaikki roolit
bortalApplication.user.VIEW_ACCOUNTEVENTS = Saa n\u00E4hd\u00E4 muiden k\u00E4ytt\u00E4jien tapahtumat
bortalApplication.user.VIEW_ALL = Saa n\u00E4hd\u00E4 kaikki k\u00E4ytt\u00E4j\u00E4t
bortalApplication.user.VIEW_OWN_ACCOUNTEVENTS = Tarkastele omia tilitapahtumia
bortalApplication.user.VIEW_SELF = Voi katsella omaa tunnusta
bortalApplication.user.VITUTTAAKO = Saa avautua
bortalApplication.user.WRITE_ORGROLES = Saa muokata organisaation rooleja
......
......@@ -33,7 +33,7 @@ public class AuthView extends GenericCDIView {
@Inject
private NavigationHandler navihandler;
@EJB
private transient BootstrapBeanLocal bootStrapBean;
......@@ -53,13 +53,12 @@ public class AuthView extends GenericCDIView {
logger.warn("Error executing logout", e);
}
}
req.getSession().invalidate();
navihandler.forward("/frontpage");
navihandler.forward("/frontpage?faces-redirect=true");
}
public String doLogout() {
HttpServletRequest req = getRequest();
if (permbean.isLoggedIn()) {
......@@ -69,28 +68,28 @@ public class AuthView extends GenericCDIView {
logger.warn("Error executing logout", e);
}
}
req.getSession().invalidate();
navihandler.forward("/frontpage");
return "/frontpage";
}
public void executeLogin() {
executeLogin(null);
}
public void executeLogin(String onError) {
if(onError == null)
if (onError == null)
onError = "/auth/loginError";
doLogin(onError);
}
private void doLogin(String onError) {
bootStrapBean.saneDefaults();
if (login == null || password == null || login.isEmpty() || password.isEmpty()) {
return;
}
......@@ -127,15 +126,15 @@ public class AuthView extends GenericCDIView {
}
}
return;
}
public void executeAdduserViewLogin() {
navihandler.saveNavigation("/admin/adduser/update");
doLogin("/admin/adduser/login");
}
public String executeLoginAction() {
executeLogin();
return null;
......
package fi.codecrew.moya.web.converter;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.inject.Named;
import fi.codecrew.moya.beans.RoleBeanLocal;
import fi.codecrew.moya.enums.CardState;
@Named()
@RequestScoped
public class CardStateConverter implements Converter {
@EJB
private RoleBeanLocal rolebean;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return CardState.valueOf(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value.toString();
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!