Commit 303eb155 by Tuomas Riihimäki

User csvdump..

1 parent 2e4d0234
......@@ -4,7 +4,6 @@
*/
package fi.insomnia.bortal.beans;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
......@@ -79,33 +78,23 @@ public class RoleBean implements RoleBeanLocal {
return roleList;
}
List<Role> children = getAllChilds(role, new HashSet<Role>());
HashSet<Role> childroles = new HashSet<Role>();
getAllChildren(role, childroles);
roleList.removeAll(childroles);
for (Role unit : children) {
if (roleList.contains(unit)) {
roleList.remove(unit);
}
}
roleList.remove(role);
return roleList;
}
private static List<Role> getAllChilds(Role role, Set<Role> checkedRoles) {
List<Role> returnList = new ArrayList<Role>();
public static final void getAllChildren(Role role, Set<Role> checkedRoles) {
if (checkedRoles.contains(role) || role == null) {
return returnList;
return;
}
for (Role unit : role.getChildren()) {
List<Role> someList = getAllChilds(unit, checkedRoles);
returnList.addAll(someList);
getAllChildren(unit, checkedRoles);
}
checkedRoles.add(role);
return returnList;
}
// @Override
......
......@@ -126,7 +126,7 @@ public abstract class GenericFacade<C extends ModelInterface> {
// return ret;
// }
// Le fu... Tuota.. generics ei hanskaa ... operaattoria.. tehdään siis
// Le fu... Tuota.. generics ei hanskaa '...' operaattoria.. tehdään siis
// näin... :(
protected SearchResult<C> searcher(SearchQuery search, FacadeCallback<C> callback) {
return searcher(search, Collections.singletonList(callback));
......
package fi.insomnia.bortal.facade.callbacks;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.From;
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.insomnia.bortal.model.AccountEvent_;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.EventUser_;
import fi.insomnia.bortal.model.GroupMembership_;
import fi.insomnia.bortal.model.Place_;
import fi.insomnia.bortal.model.Product_;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.Role_;
......@@ -25,17 +35,53 @@ public class EventUserRolefilter implements FacadeCallback<EventUser> {
roles = filters;
}
@Override
private static final Set<Integer> getAllChildren(Collection<Role> roles, Set<Integer> checkedRoles) {
for (Role role : roles)
{
if (role == null || checkedRoles.contains(role.getId())) {
continue;
}
checkedRoles.add(role.getId());
getAllChildren(role.getChildren(), checkedRoles);
}
return checkedRoles;
}
public void exec(CriteriaBuilder cb, CriteriaQuery<?> cq, From<?, EventUser> root, List<Predicate> predicates) {
if (roles != null && !roles.isEmpty())
{
List<Integer> roleids = new ArrayList<Integer>();
for (Role r : roles) {
roleids.add(r.getId());
}
HashSet<Integer> roleids = new HashSet<Integer>();
getAllChildren(roles, roleids);
logger.debug("Requiring roles {}", roleids);
Predicate pred = root.join(EventUser_.roles).get(Role_.id).in(roleids);
predicates.add(pred);
Path<Integer> rootId = root.get(EventUser_.id);
ArrayList<Predicate> orPreds = new ArrayList<Predicate>();
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.users).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.productsProvide).join(Product_.accountEvents).get(AccountEvent_.user).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
{
Subquery<Integer> subq = cq.subquery(Integer.class);
Root<Role> subroot = subq.from(Role.class);
subq.select(subroot.join(Role_.productsProvide).join(Product_.places).get(Place_.placeReserver).get(GroupMembership_.user).get(EventUser_.id));
subq.where(subroot.get(Role_.id).in(roleids));
orPreds.add(rootId.in(subq));
}
predicates.add(cb.or(orPreds.toArray(new Predicate[orPreds.size()])));
}
}
}
......@@ -4,12 +4,16 @@ import java.io.Serializable;
public class SearchQuery implements Serializable {
public enum QuerySortOrder {
UNSORTED, ASCENDING, DESCENDING
}
private static final long serialVersionUID = -8777921789916093938L;
private int page = 0;
private int pagesize = 20;
private String sort = null;
private String search = null;
private Boolean direction = false;
private QuerySortOrder sortDirection = QuerySortOrder.UNSORTED;
public SearchQuery()
{
......@@ -70,12 +74,12 @@ public class SearchQuery implements Serializable {
}
}
public Boolean isDirection() {
return direction;
public QuerySortOrder getSortDirection() {
return sortDirection;
}
public void setDirection(Boolean direction) {
this.direction = direction;
public void setSortDirection(QuerySortOrder sortDirection) {
this.sortDirection = sortDirection;
}
}
......@@ -2,18 +2,19 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools">
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:tools="http://java.sun.com/jsf/composite/tools" xmlns:p="http://primefaces.org/ui">
<composite:interface>
</composite:interface>
<composite:implementation>
<h:outputScript library="primefaces" name="jquery/jquery.js" target="head" />
<h:dataTable styleClass="bordertable" id="user" value="#{userSearchView.eventUserResults}" var="user">
<h:column>
<p:dataTable styleClass="bordertable" id="usertable" value="#{userSearchView.eventuserModel}" rows="20" paginator="true" lazy="true" var="user">
<p:column>
<f:facet name="header">
<h:link value="#{i18n['user.nick']}" includeViewParams="true">
<f:param name="sort" value="nick" />
<f:param name="page" value="0" />
</h:link>
</f:facet>
<h:outputText styleClass="hoverable" value="#{(empty user.nick)?'----':user.nick}" />
......@@ -47,8 +48,8 @@
</h:panelGrid>
</div>
</h:column>
<h:column>
</p:column>
<p:column>
<f:facet name="header">
<h:link value="#{i18n['user.firstNames']}" includeViewParams="true">
<f:param name="sort" value="firstnames" />
......@@ -56,8 +57,8 @@
</h:link>
</f:facet>
<h:outputText value="#{user.firstnames}" />
</h:column>
<h:column>
</p:column>
<p:column>
<f:facet name="header">
<h:link value="#{i18n['user.lastName']}" includeViewParams="true">
<f:param name="sort" value="lastname" />
......@@ -65,16 +66,24 @@
</h:link>
</f:facet>
<h:outputText value="#{user.lastname}" />
</h:column>
</p:column>
<p:column>
<f:facet name="header">
<h:link value="#{i18n['user.email']}" includeViewParams="true" >
<f:param name="sort" value="email" />
</h:link>
<h:outputText value="#{user.email}" />
</f:facet>
</p:column>
<h:column>
<button onClick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.user.id}')">#{i18n['user.edit']}</button>
</h:column>
<p:column>
<button onclick="location.replace('#{request.contextPath}/useradmin/edit.jsf?userid=#{user.user.id}')">#{i18n['user.edit']}</button>
</p:column>
<!-- <h:column>
<h:commandButton action="#{userView.shop()}" value="#{i18n['user.shop']}" />
</h:column> -->
</h:dataTable>
</p:dataTable>
<script>
jQuery(function() {
jQuery(".hoverable").hover(function () {
......
<!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:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"
>
<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:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<ui:composition template="/layout/#{sessionHandler.layout}/template.xhtml">
<f:metadata>
......@@ -22,6 +20,7 @@
<h1>#{i18n['userlist.header']}</h1>
<h:form>
<h:panelGrid columns="2">
<h:panelGroup>
<a onclick="$('#advancedSearch').show(); $(this).hide();"><h:outputText value="#{i18n['userlist.showAdvancedSearch']}" /></a>
......@@ -55,18 +54,19 @@
<br />
<h:commandButton actionListener="#{userSearchView.addToCart}" value="#{i18n['usercart.addSearchedUsers']}" />
<h:commandButton action="#{userCartView.traverse}" value="#{i18n['usercart.traverse']}" />
<h:commandButton value="#{i18n['usercart.downloadCsv']}">
<p:fileDownload value="#{userCartView.downloadCsv}" />
</h:commandButton>
</div>
</h:panelGroup>
</h:panelGrid>
<h:outputText value="#{i18n['userlist.searchcount']}" />: <h:outputText value="#{userSearchView.resultcount}" />
</h:form>
<p>
<users:list rendered="#{!userSearchView.searchQuery.onlyThisEvent}" />
<users:eventuserlist rendered="#{userSearchView.searchQuery.onlyThisEvent}" />
</p>
<p>
<tools:paginationHeader view="#{userSearchView}" />
</p>
</ui:define>
</ui:composition>
</h:body>
......
......@@ -10,7 +10,8 @@
#{sessionHandler.flushCache()}
<h:form>
<h:commandButton action="#{testView.resetMenu()}" value="Reset menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
<h:commandButton action="#{testView.resetMenu()}" value="Reset to newui menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
<h:commandButton action="#{testView.resetOldMenu()}" value="Reset to old menu" onclick="return confirm('THIS WILL RESET ALL MODIFICATIONS TO DEFAULT MENU!!\n Are you really sure?!');" />
</h:form>
</ui:define>
......
......@@ -444,7 +444,7 @@ passwordChanged.header = Password changed successfully.
passwordReset.errorChanging = Unexpected error whilst password reset. Contact your administrator.
passwordReset.hashNotFound = Password change token has expired. Please send the query again.
passwordreset.mailBody = You can change your password in address\: {0}\n\nIf you have not requested password reset, ignore this message.\n\n
passwordreset.mailBody = You can change your password in address: {0}\n\nIf you have not requested password reset, ignore this message.\n\n
passwordreset.mailSubject = [{0}] Password reset
passwordreset.usernotfound = Username not found. Please note that username is case sensitive.
......@@ -839,6 +839,7 @@ userlist.placeassoc = Assigned to place
userlist.rolefilter = Assigned roles
userlist.saldofilter = Saldo
userlist.search = Search
userlist.searchcount = Result count
userlist.showAdvancedSearch = Advanced search
usertitle.managingUser = Shop
......
......@@ -817,6 +817,7 @@ userlist.placeassoc = Liitetty paikkaan
userlist.rolefilter = Annetut roolit
userlist.saldofilter = Tilin saldo
userlist.search = Etsi
userlist.searchcount = Tuloksia
userlist.showAdvancedSearch = Tarkennettu haku
usertitle.managingUser = Kauppa
......
......@@ -64,6 +64,11 @@ public class TestDataView {
return null;
}
public String resetOldMenu() {
menubean.flushOldMenu();
return null;
}
public String makeTestData() {
testdatabean.createAdmin();
return null;
......
......@@ -149,12 +149,4 @@ public abstract class PaginationView<T extends ModelInterface> extends GenericCD
this.searchQuery = searchQuery;
}
public Boolean isDirection() {
return searchQuery.isDirection();
}
public void setDirection(Boolean direction) {
searchQuery.setDirection(direction);
}
}
package fi.insomnia.bortal.web.cdiview.user;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
......@@ -7,6 +10,8 @@ import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -19,6 +24,8 @@ public class UserCartView extends GenericCDIView {
private static final long serialVersionUID = 5294631925744474031L;
private static final Charset UTF8 = Charset.forName("UTF-8");
private Integer current = 0;
@Inject
......@@ -26,12 +33,37 @@ public class UserCartView extends GenericCDIView {
private List<EventUser> usercart;
public void initView() {
private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
public StreamedContent getDownloadCsv() {
StringBuilder sb = new StringBuilder();
sb.append("firstname").append(";");
sb.append("lastname").append(";");
sb.append("nick").append(";");
sb.append("login").append(";");
sb.append("birthday").append(";");
sb.append("phone").append(";");
sb.append("email").append(";");
sb.append("\n");
for (EventUser uc : usercart)
{
sb.append(uc.getFirstnames()).append(";");
sb.append(uc.getLastname()).append(";");
sb.append(uc.getNick()).append(";");
sb.append(uc.getLogin()).append(";");
sb.append(uc.getBirthday() != null ? dateformat.format(uc.getBirthday()) : "").append(";");
sb.append(uc.getPhone()).append(";");
sb.append(uc.getEmail()).append(";");
sb.append("\n");
}
DefaultStreamedContent ret = new DefaultStreamedContent(new ByteArrayInputStream(sb.toString().getBytes(UTF8)));
ret.setContentType("text/csv");
return ret;
}
private static final Logger logger = LoggerFactory
.getLogger(UserCartView.class);
private static final Logger logger = LoggerFactory.getLogger(UserCartView.class);
public String next() {
++current;
......
package fi.insomnia.bortal.web.cdiview.user;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.User;
import fi.insomnia.bortal.util.UserSearchQuery;
import fi.insomnia.bortal.utilities.SearchQuery.QuerySortOrder;
import fi.insomnia.bortal.utilities.SearchResult;
import fi.insomnia.bortal.web.cdiview.PaginationView;
@Named
@RequestScoped
@ConversationScoped
public class UserSearchView extends PaginationView<User> {
/**
......@@ -32,6 +37,8 @@ public class UserSearchView extends PaginationView<User> {
private UserSearchQuery usersearch = new UserSearchQuery();
private LazyDataModel<EventUser> eventuserModel;
public void addToCart()
{
int pagesize = usersearch.getPagesize();
......@@ -47,7 +54,33 @@ public class UserSearchView extends PaginationView<User> {
}
public void initView() {
if (requirePermissions(permbean.hasPermission(UserPermission.VIEW_ALL))) {
eventuserModel = new LazyDataModel<EventUser>() {
private static final long serialVersionUID = 1L;
@Override
public List<EventUser> load(int first, int pageSize, String sortField,
SortOrder sortOrder, Map<String, String> filters) {
UserSearchQuery sq = getSearchQuery();
sq.setPagesize(pageSize);
if (pageSize > 0)
{
sq.setPage(first / pageSize);
}
sq.setSort(sortField);
sq.setSortDirection(SortOrder.ASCENDING.equals(sortOrder) ? QuerySortOrder.ASCENDING : (SortOrder.DESCENDING.equals(sortOrder) ? QuerySortOrder.DESCENDING : QuerySortOrder.UNSORTED));
SearchResult<EventUser> sr = userbean.getThisEventsUsers(sq);
this.setRowCount(new Long(sr.getResultcount()).intValue());
setResultcount(sr.getResultcount());
setEventUserResults(sr.getResults());
return sr.getResults();
}
};
if (usersearch.isOnlyThisEvent() || usersearch.getSearch() == null || usersearch.getSearch().isEmpty())
{
usersearch.setOnlyThisEvent(true);
......@@ -58,6 +91,7 @@ public class UserSearchView extends PaginationView<User> {
else {
super.setResult(userbean.getEventUsers(getSearchQuery()));
}
super.beginConversation();
}
}
......@@ -75,4 +109,12 @@ public class UserSearchView extends PaginationView<User> {
this.eventUserResults = eventUserResults;
}
public LazyDataModel<EventUser> getEventuserModel() {
return eventuserModel;
}
public void setEventuserModel(LazyDataModel<EventUser> eventuserModel) {
this.eventuserModel = eventuserModel;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!