Commit 8c607a95 by Tuomas Riihimäki

Merge branch 'master' into groupmgmt

2 parents b45286ac 8a2b16a8
Showing with 314 additions and 67 deletions
...@@ -109,4 +109,12 @@ public class EventMapBean implements EventMapBeanLocal { ...@@ -109,4 +109,12 @@ public class EventMapBean implements EventMapBeanLocal {
public Place updatePlace(Place place) { public Place updatePlace(Place place) {
return placefacade.merge(place); return placefacade.merge(place);
} }
@Override
@RolesAllowed(MapPermission.S_MANAGE_MAPS)
public void createPlace(Place place) {
EventMap map = eventmapfacade.reload(place.getMap());
map.getPlaces().add(place);
place.setMap(map);
}
} }
...@@ -105,12 +105,15 @@ public class MenuBean implements MenuBeanLocal { ...@@ -105,12 +105,15 @@ public class MenuBean implements MenuBeanLocal {
userkauppa.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL); userkauppa.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL);
userkauppa.addPage(menuitemfacade.findOrCreate("/foodwave/list"), ShopPermission.SHOP_FOODWAVE); userkauppa.addPage(menuitemfacade.findOrCreate("/foodwave/list"), ShopPermission.SHOP_FOODWAVE);
userkauppa.addPage(menuitemfacade.findOrCreate("/bill/list"), BillPermission.VIEW_OWN); 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_ACCOUNTEVENTS);
MenuNavigation userPlaces = usermenu.addPage(null, null); MenuNavigation userPlaces = usermenu.addPage(null, null);
userPlaces.setKey("topnavi.userplaces"); userPlaces.setKey("topnavi.userplaces");
userPlaces.addPage(menuitemfacade.findOrCreate("/place/placemap"), MapPermission.VIEW); userPlaces.addPage(menuitemfacade.findOrCreate("/place/placemap"), MapPermission.VIEW);
userPlaces.addPage(menuitemfacade.findOrCreate("/place/myGroups"), MapPermission.BUY_PLACES); userPlaces.addPage(menuitemfacade.findOrCreate("/place/myGroups"), MapPermission.BUY_PLACES);
userPlaces.addPage(menuitemfacade.findOrCreate("/place/edit"), MapPermission.MANAGE_OTHERS).setVisible(false);
MenuNavigation usercompetitions = usermenu.addPage(null, null); MenuNavigation usercompetitions = usermenu.addPage(null, null);
usercompetitions.setKey("topnavi.competitions"); usercompetitions.setKey("topnavi.competitions");
......
...@@ -182,7 +182,8 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -182,7 +182,8 @@ public class PlaceBean implements PlaceBeanLocal {
} }
/** /**
* Reserve the place for user. This reservation will timeout after a while buy() method should be called after this when buying place; * Reserve the place for user. This reservation will timeout after a while
* buy() method should be called after this when buying place;
* *
* @param place * @param place
* place to be reserved * place to be reserved
...@@ -196,7 +197,15 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -196,7 +197,15 @@ public class PlaceBean implements PlaceBeanLocal {
place = placeFacade.find(place.getId()); place = placeFacade.find(place.getId());
user = eventUserFacade.find(user.getId()); user = eventUserFacade.find(user.getId());
boolean ret = false; boolean ret = false;
if (place.isBuyable() && !place.isTaken()) {
// when admin click's place, he reserves it -> just ignore it
if (!place.isTaken() || (permbean.hasPermission(MapPermission.MANAGE_OTHERS) && permbean.getCurrentUser().equals(place.getCurrentUser()) )) {
if (place.isBuyable() || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
if(!place.isBuyable()) {
place.setBuyable(true);
}
place.setCurrentUser(user); place.setCurrentUser(user);
place.setReleaseTime(Calendar.getInstance()); place.setReleaseTime(Calendar.getInstance());
place.getReleaseTime().add(Calendar.MINUTE, RESERVE_MINUTES); place.getReleaseTime().add(Calendar.MINUTE, RESERVE_MINUTES);
...@@ -215,6 +224,7 @@ public class PlaceBean implements PlaceBeanLocal { ...@@ -215,6 +224,7 @@ public class PlaceBean implements PlaceBeanLocal {
} }
ret = true; ret = true;
} }
}
return ret; return ret;
} }
......
...@@ -34,13 +34,12 @@ import fi.codecrew.moya.model.LanEventPropertyKey; ...@@ -34,13 +34,12 @@ import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.PlaceGroup; import fi.codecrew.moya.model.PlaceGroup;
import fi.codecrew.moya.model.User; import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.BarcodeUtils; import fi.codecrew.moya.utilities.BarcodeUtils;
import fi.codecrew.moya.utilities.I18n;
/** /**
* Session Bean implementation class PlaceGroupBean * Session Bean implementation class PlaceGroupBean
*/ */
@Stateless @Stateless
@DeclareRoles({ SpecialPermission.S_USER, MapPermission.S_BUY_PLACES }) @DeclareRoles({ SpecialPermission.S_USER, MapPermission.S_BUY_PLACES, MapPermission.S_MANAGE_MAPS })
public class PlaceGroupBean implements PlaceGroupBeanLocal { public class PlaceGroupBean implements PlaceGroupBeanLocal {
private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class); private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class);
...@@ -87,7 +86,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -87,7 +86,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// } // }
@Override @Override
@RolesAllowed(SpecialPermission.S_USER) @RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<GroupMembership> getMembershipsAndCreations(EventUser user) { public List<GroupMembership> getMembershipsAndCreations(EventUser user) {
if (user == null) { if (user == null) {
user = permbean.getCurrentUser(); user = permbean.getCurrentUser();
...@@ -99,7 +98,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -99,7 +98,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
} }
@Override @Override
@RolesAllowed(SpecialPermission.S_USER) @RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<GroupMembership> getMemberships(EventUser user) { public List<GroupMembership> getMemberships(EventUser user) {
if (user == null) { if (user == null) {
user = permbean.getCurrentUser(); user = permbean.getCurrentUser();
...@@ -133,7 +132,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -133,7 +132,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
} }
@Override @Override
@RolesAllowed(SpecialPermission.S_USER) @RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public void getGroupMembershipPdf(EventUser usr, OutputStream ostream) { public void getGroupMembershipPdf(EventUser usr, OutputStream ostream) {
List<GroupMembership> memberships = getMembershipsAndCreations(usr); List<GroupMembership> memberships = getMembershipsAndCreations(usr);
...@@ -161,13 +160,12 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -161,13 +160,12 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
Font titlefont = new Font(pdf, CoreFont.TIMES_ROMAN); Font titlefont = new Font(pdf, CoreFont.TIMES_ROMAN);
titlefont.setSize(20); titlefont.setSize(20);
Page page = new Page(pdf, A4.PORTRAIT); Page page = new Page(pdf, A4.PORTRAIT);
int y = YSTART; int y = YSTART;
String titletext = "Lipputositteet"; String titletext = "Lipputositteet";
if(printOnlyOwn || memberships.size() <= 1) { if (printOnlyOwn || memberships.size() <= 1) {
titletext = "Lipputosite"; titletext = "Lipputosite";
} }
...@@ -177,7 +175,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -177,7 +175,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
y += 30; y += 30;
for (GroupMembership membership : memberships) { for (GroupMembership membership : memberships) {
if (y > 750) { if (y > 750) {
...@@ -185,7 +182,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -185,7 +182,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
y = YSTART; y = YSTART;
} }
if(printOnlyOwn && (membership.getUser() == null || !membership.getUser().equals(usr))) { if (printOnlyOwn && (membership.getUser() == null || !membership.getUser().equals(usr))) {
continue; continue;
} }
...@@ -195,15 +192,15 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -195,15 +192,15 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// logger.debug("Jpeg: " + jpeg.getWidth() + " h. " + // logger.debug("Jpeg: " + jpeg.getWidth() + " h. " +
// jpeg.getHeight()); // jpeg.getHeight());
if(placecodeFromUser) { if (placecodeFromUser) {
if(membership.getUser() != null) { if (membership.getUser() != null) {
Image image = new Image(pdf, barcodeBean.getUserBarcode(membership.getUser()), ImageType.PNG); Image image = new Image(pdf, barcodeBean.getUserBarcode(membership.getUser()), ImageType.PNG);
image.scaleBy(0.8); image.scaleBy(0.8);
image.setPosition(50, y); image.setPosition(50, y);
image.drawOn(page); image.drawOn(page);
} else { } else {
TextLine nouser = new TextLine(bigfont, "EMPTY PLACE" ); TextLine nouser = new TextLine(bigfont, "EMPTY PLACE");
nouser.setPosition(85, y+10); nouser.setPosition(85, y + 10);
nouser.drawOn(page); nouser.drawOn(page);
} }
} else { } else {
...@@ -213,8 +210,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -213,8 +210,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
image.drawOn(page); image.drawOn(page);
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (membership.getPlaceReservation().getName() != null) if (membership.getPlaceReservation().getName() != null)
{ {
...@@ -252,11 +247,9 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -252,11 +247,9 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
y = YSTART; y = YSTART;
} }
String footertext = "Nämä lipputositteenne tulee olla tulostettuna paperille kun saavutte tapahtumaan."; String footertext = "Nämä lipputositteenne tulee olla tulostettuna paperille kun saavutte tapahtumaan.";
if(printOnlyOwn || memberships.size() <= 1) { if (printOnlyOwn || memberships.size() <= 1) {
footertext = "Tämä henkilökohtainen lipputositteesi tulee olla mukana tulostettuna paperille kun saavut tapahtumaan."; footertext = "Tämä henkilökohtainen lipputositteesi tulee olla mukana tulostettuna paperille kun saavut tapahtumaan.";
} }
...@@ -272,19 +265,20 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal { ...@@ -272,19 +265,20 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
} }
@Override @Override
@RolesAllowed(SpecialPermission.S_USER) @RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public void releaseAndGenerateToken(GroupMembership gmem) { public void releaseAndGenerateToken(GroupMembership gmem) {
gmem = gmemfacade.find(gmem.getId()); gmem = gmemfacade.reload(gmem);
if (!(permbean.getCurrentUser().getId().equals(gmem.getPlaceGroup().getCreator().getId()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS))) { if (!(permbean.getCurrentUser().getId().equals(gmem.getPlaceGroup().getCreator().getId()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS))) {
loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem); loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem);
throw new EJBAccessException("Not enough rights to release token"); throw new EJBAccessException("Not enough rights to release token");
} }
gmem.setUser(null); gmem.setUser(null);
gmem.setInviteToken(gmemfacade.createInviteToken()); gmem.setInviteToken(gmemfacade.createInviteToken());
logger.info("Place released. {} new token {}", gmem.getInviteToken());
} }
@Override @Override
@RolesAllowed(SpecialPermission.S_USER) @RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<PlaceGroup> getPlacegroups(EventUser user) { public List<PlaceGroup> getPlacegroups(EventUser user) {
return pgfacade.find(user); return pgfacade.find(user);
} }
......
...@@ -202,8 +202,13 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -202,8 +202,13 @@ public class ReaderBean implements ReaderBeanLocal {
@Override @Override
public List<ReaderEvent> getReaderEvents(Integer readerId) { public List<ReaderEvent> getReaderEvents(Integer readerId) {
return getReaderEvents(readerId, 20);
}
@Override
public List<ReaderEvent> getReaderEvents(Integer readerId, Integer count) {
Reader reader = readerfacade.find(readerId); Reader reader = readerfacade.find(readerId);
return readerEventFacade.findLastEvents(reader, 20); return readerEventFacade.findLastEvents(reader, count);
} }
@Override @Override
...@@ -294,4 +299,9 @@ public class ReaderBean implements ReaderBeanLocal { ...@@ -294,4 +299,9 @@ public class ReaderBean implements ReaderBeanLocal {
return ret; return ret;
} }
@Override
public List<ReaderEvent> getReaderEventsAfterEvent(Integer readerId, Integer eventId) {
Reader reader = getReader(readerId);
return readerEventFacade.findEventsAfterEvent(reader, eventId);
}
} }
...@@ -31,8 +31,26 @@ public class ReaderEventFacade extends IntegerPkGenericFacade<ReaderEvent> { ...@@ -31,8 +31,26 @@ public class ReaderEventFacade extends IntegerPkGenericFacade<ReaderEvent> {
cq.orderBy(cb.desc(root.get(ReaderEvent_.time))); cq.orderBy(cb.desc(root.get(ReaderEvent_.time)));
TypedQuery<ReaderEvent> q = getEm().createQuery(cq); TypedQuery<ReaderEvent> q = getEm().createQuery(cq);
if (count > 0) {
q.setMaxResults(count); q.setMaxResults(count);
}
return q.getResultList();
}
public List<ReaderEvent> findEventsAfterEvent(Reader reader, Integer eventId) {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<ReaderEvent> cq = cb.createQuery(ReaderEvent.class);
Root<ReaderEvent> root = cq.from(ReaderEvent.class);
cq.where(cb.equal(root.get(ReaderEvent_.reader), reader),
cb.gt(root.get(ReaderEvent_.id), eventId));
cq.orderBy(cb.desc(root.get(ReaderEvent_.time)));
TypedQuery<ReaderEvent> q = getEm().createQuery(cq);
return q.getResultList(); return q.getResultList();
} }
} }
...@@ -24,4 +24,6 @@ public interface EventMapBeanLocal { ...@@ -24,4 +24,6 @@ public interface EventMapBeanLocal {
Place updatePlace(Place place); Place updatePlace(Place place);
void createPlace(Place create);
} }
...@@ -41,4 +41,8 @@ public interface ReaderBeanLocal { ...@@ -41,4 +41,8 @@ public interface ReaderBeanLocal {
ReaderEvent checkTag(String readerIdent, String tag); ReaderEvent checkTag(String readerIdent, String tag);
List<ReaderEvent> getReaderEvents(Integer readerId, Integer count);
List<ReaderEvent> getReaderEventsAfterEvent(Integer readerId, Integer eventId);
} }
package fi.codecrew.moya.model; package fi.codecrew.moya.model;
import java.math.BigDecimal;
import java.sql.Time;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
...@@ -24,9 +26,13 @@ import javax.validation.constraints.NotNull; ...@@ -24,9 +26,13 @@ import javax.validation.constraints.NotNull;
import org.eclipse.persistence.annotations.OptimisticLocking; import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType; import org.eclipse.persistence.annotations.OptimisticLockingType;
import org.eclipse.persistence.annotations.PrivateOwned; import org.eclipse.persistence.annotations.PrivateOwned;
import org.eclipse.persistence.annotations.TimeOfDay;
import org.eclipse.persistence.jpa.jpql.parser.DateTime;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.sun.xml.ws.commons.xmlutil.Converter;
import fi.codecrew.moya.enums.Gender; import fi.codecrew.moya.enums.Gender;
import fi.codecrew.moya.utilities.PasswordFunctions; import fi.codecrew.moya.utilities.PasswordFunctions;
...@@ -366,6 +372,42 @@ public class User extends GenericEntity implements IUser { ...@@ -366,6 +372,42 @@ public class User extends GenericEntity implements IUser {
this.licenseCodes = codes; this.licenseCodes = codes;
} }
public BigDecimal getAge() {
BigDecimal age = new BigDecimal(0);
if(birthday != null) {
Calendar calBirthday = Calendar.getInstance();
calBirthday.setTime(birthday);
Calendar calNow = Calendar.getInstance();
int yearB = calBirthday.get(Calendar.YEAR);
int yearNow = calNow.get(Calendar.YEAR);
int years = yearNow - yearB -1;
int dayOfYearBirthDay = calBirthday.get(Calendar.DAY_OF_YEAR);
int dayOfYear = calNow.get(Calendar.DAY_OF_YEAR);
int days = 0;
if(dayOfYearBirthDay > dayOfYear) {
calBirthday.set(Calendar.YEAR, yearNow - 1);
days = 365 - calBirthday.get(Calendar.DAY_OF_YEAR) + dayOfYear;
} else {
days = dayOfYear - dayOfYearBirthDay;
}
BigDecimal decimalYears = new BigDecimal(years);
float fraction = (float)((float)days/(float)365);
BigDecimal decimalDays = new BigDecimal(fraction);
age = age.add(decimalYears);
age = age.add(decimalDays);
System.out.print("Years: " + years + "\n");
System.out.print("Days: " + days + "\n");
System.out.print("Fraction of days: " + fraction + "\n");
}
return age;
}
public String getShortUserDescriptor() { public String getShortUserDescriptor() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(getNick()).append(" // ").append(getWholeName()).append(" // ").append(getEmail()); sb.append(getNick()).append(" // ").append(getWholeName()).append(" // ").append(getEmail());
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!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:ui="http://java.sun.com/jsf/facelets" <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:map="http://java.sun.com/jsf/composite/cditools/map" xmlns:tools="http://java.sun.com/jsf/composite/cditools" xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:h="http://java.sun.com/jsf/html"
> xmlns:map="http://java.sun.com/jsf/composite/cditools/map"
xmlns:tools="http://java.sun.com/jsf/composite/cditools"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
......
...@@ -100,6 +100,12 @@ ...@@ -100,6 +100,12 @@
<h:outputText value="#{user.firstnames}" /> <h:outputText value="#{user.firstnames}" />
</h:column> </h:column>
<h:column> <h:column>
<f:facet name="header">
<h:outputText value="#{i18n['user.lastName']}" />
</f:facet>
<h:outputText value="#{user.lastname}"/>
</h:column>
<h:column>
<h:commandButton action="#{placeView.reserveForUser()}" value="#{i18n['place.reserveForUser']}" /> <h:commandButton action="#{placeView.reserveForUser()}" value="#{i18n['place.reserveForUser']}" />
</h:column> </h:column>
</h:dataTable> </h:dataTable>
......
...@@ -86,59 +86,90 @@ ...@@ -86,59 +86,90 @@
<table> <table>
<ui:fragment rendered="#{!cc.attrs.creating}"> <ui:fragment rendered="#{!cc.attrs.creating}">
<tr> <tr>
<td colspan="2"><h:outputLabel for="login" value="#{i18n['user.login']}" /><br /> <h:outputText value="#{userView.selectedUser.login}" id="login" /></td> <td colspan="2"><b><h:outputLabel for="login" value="#{i18n['user.login']}" /></b><br />
<h:outputText value="#{userView.selectedUser.login}" id="login" />
</td>
</tr> </tr>
</ui:fragment> </ui:fragment>
<tr> <tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td colspan="2"><b><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> </b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" /> <p:inputText size="45" id="nick" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.nick}" />
</p:inplace></td> </p:inplace>
</td>
</tr> </tr>
<tr> <tr>
<td><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td><b><h:outputLabel value="#{i18n['user.firstNames']}" for="firstnames" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" /> <p:inputText size="22" id="firstnames" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.firstnames}" />
</p:inplace></td> </p:inplace>
<td><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> </td>
<td><b><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" /> <p:inputText size="30" id="lastname" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.lastname}" />
</p:inplace></td> </p:inplace>
</td>
</tr> </tr>
<tr> <tr>
<td><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td colspan="2"><b><h:outputLabel value="#{i18n['user.sex']}" for="sex" /></b> <br />
<p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" value="#{userView.selectedUser.birthday}"> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
<f:convertDateTime pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
</p:calendar>
</p:inplace> <h:message for="birthday" /></td>
<td><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
<f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" /> <f:selectItem id="undefined" itemLabel="#{i18n['user.sex.UNDEFINED']}" itemValue="UNDEFINED" />
<f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" /> <f:selectItem id="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" /> <f:selectItem id="female" itemLabel="#{i18n['user.sex.FEMALE']}" itemValue="FEMALE" />
</p:selectOneMenu></td> </p:selectOneMenu>
</td>
</tr>
<tr>
<td><b><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:calendar id="birthday" navigator="true" yearRange="c-80:c-0" value="#{userView.selectedUser.birthday}">
<f:convertDateTime pattern="#{sessionHandler.dateFormat}" timeZone="#{sessionHandler.timezone}" />
</p:calendar>
</p:inplace> <h:message for="birthday" />
</td>
<td><b><h:outputLabel for="age" value="#{i18n['user.age']}" /></b><br />
<h:outputText value="#{userView.selectedUser.user.age}">
<f:convertNumber minFractionDigits="2" maxFractionDigits="2"/>
</h:outputText>
</td>
</tr> </tr>
</table> </table>
<table> <table>
<tr> <tr>
<td colspan="2"><p:outputLabel value="#{i18n['user.address']}" for="address" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td colspan="2"><b><p:outputLabel value="#{i18n['user.address']}" for="address" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" /> <p:inputText size="45" id="address" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.address}" />
</p:inplace></td> </p:inplace>
</td>
</tr> </tr>
<tr> <tr>
<td><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td><b><p:outputLabel value="#{i18n['user.zipCode']}" for="zip" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" /> <p:inputText styleClass="ui-input" size="7" id="zip" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.zip}" />
</p:inplace> <p:message for="zip" /></td> </p:inplace> <p:message for="zip" />
<td><p:outputLabel value="#{i18n['user.town']}" for="town" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> </td>
<td><b><p:outputLabel value="#{i18n['user.town']}" for="town" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" /> <p:inputText styleClass="ui-input" size="25" id="town" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.town}" />
</p:inplace> <p:message for="town" /></td> </p:inplace> <p:message for="town" />
</td>
</tr> </tr>
<tr> <tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.email']}" for="email" /> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td colspan="2"><b><h:outputLabel value="#{i18n['user.email']}" for="email" /></b> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" /> <p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace></td> </p:inplace>
</td>
</tr> </tr>
<tr> <tr>
<td><p:outputLabel value="#{i18n['user.phone']}" for="phone" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}"> <td><b><p:outputLabel value="#{i18n['user.phone']}" for="phone" /></b><br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText styleClass="ui-input" size="7" id="phone" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.phone}" /> <p:inputText styleClass="ui-input" size="7" id="phone" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.phone}" />
</p:inplace> <p:message for="phone" /></td> </p:inplace> <p:message for="phone" />
</td>
</tr> </tr>
</table> </table>
......
...@@ -1153,6 +1153,7 @@ user.accountBalance = Account balance ...@@ -1153,6 +1153,7 @@ user.accountBalance = Account balance
user.accountEventHeader = Account events user.accountEventHeader = Account events
user.accountevents = Account events user.accountevents = Account events
user.address = Address user.address = Address
user.age = Age
user.bank = Bank user.bank = Bank
user.bankaccount = Bank number user.bankaccount = Bank number
user.birthday = Birthday user.birthday = Birthday
......
...@@ -1138,9 +1138,10 @@ user.accountBalance = Tilin saldo ...@@ -1138,9 +1138,10 @@ user.accountBalance = Tilin saldo
user.accountEventHeader = Tilitapahtumat user.accountEventHeader = Tilitapahtumat
user.accountevents = Tilitapahtumat user.accountevents = Tilitapahtumat
user.address = Osoite user.address = Osoite
user.age = Ik
user.bank = Pankki user.bank = Pankki
user.bankaccount = Pankkitili user.bankaccount = Pankkitili
user.birthday = Syntym\u00E4p\u00E4iv\u00E4 user.birthday = Syntym\u00E4aika
user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi
user.changePassword = Vaihda salasana user.changePassword = Vaihda salasana
user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle
......
...@@ -20,10 +20,14 @@ import org.slf4j.LoggerFactory; ...@@ -20,10 +20,14 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal; import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.EventMapBeanLocal; import fi.codecrew.moya.beans.EventMapBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal; import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.PlaceMapBeanLocal; import fi.codecrew.moya.beans.PlaceMapBeanLocal;
import fi.codecrew.moya.beans.ProductBeanLocal; import fi.codecrew.moya.beans.ProductBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.exceptions.BortalCatchableException;
import fi.codecrew.moya.model.EventMap; import fi.codecrew.moya.model.EventMap;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.Place; import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.Product; import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.rest.pojo.MapRoot; import fi.codecrew.moya.rest.pojo.MapRoot;
...@@ -47,6 +51,11 @@ public class MapAdminView { ...@@ -47,6 +51,11 @@ public class MapAdminView {
private EventBeanLocal eventbean; private EventBeanLocal eventbean;
@EJB @EJB
private ProductBeanLocal productbean; private ProductBeanLocal productbean;
@EJB
private UserBeanLocal eventuserbean;
@EJB
private transient PlaceBeanLocal placebean;
private static final Logger logger = LoggerFactory.getLogger(MapAdminView.class); private static final Logger logger = LoggerFactory.getLogger(MapAdminView.class);
@GET @GET
...@@ -86,8 +95,10 @@ public class MapAdminView { ...@@ -86,8 +95,10 @@ public class MapAdminView {
@POST @POST
@Path("/place/") @Path("/place/")
public Response createPlace(PlaceInputPojo create) { public Response createPlace(PlaceInputPojo create) {
logger.info("Finding map with id {}", create.getMapId());
EventMap map = eventmapbean.find(create.getMapId()); EventMap map = eventmapbean.find(create.getMapId());
if (map == null) { if (map == null) {
logger.warn("No map found!");
return Response.serverError().entity("Error with mapId").build(); return Response.serverError().entity("Error with mapId").build();
} }
Place place = new Place(); Place place = new Place();
...@@ -95,7 +106,8 @@ public class MapAdminView { ...@@ -95,7 +106,8 @@ public class MapAdminView {
setPlaceValues(place, create); setPlaceValues(place, create);
if (create.getProductId() != null && (place.getProduct() == null || !place.getProduct().getId().equals(create.getProductId()))) if (create.getProductId() != null && (place.getProduct() == null || !place.getProduct().getId().equals(create.getProductId())))
return Response.serverError().entity("Product id unknown!").build(); return Response.serverError().entity("Product id unknown!").build();
logger.info("Creating new place {}", place.getName());
eventmapbean.createPlace(place);
return Response.ok().entity(new PlaceOutPojo(place)).build(); return Response.ok().entity(new PlaceOutPojo(place)).build();
} }
...@@ -117,6 +129,36 @@ public class MapAdminView { ...@@ -117,6 +129,36 @@ public class MapAdminView {
return Response.ok(new PlaceOutPojo(place)).build(); return Response.ok(new PlaceOutPojo(place)).build();
} }
@PUT
@Path("/place/{placeId}/release")
public Response releasePlace(@PathParam("placeId") Integer placeId) {
Place place = eventmapbean.findPlace(placeId);
if (place == null) {
return Response.serverError().entity("Place not found!").build();
}
logger.info("Releasing place {}", place);
placebean.unbuyPlace(place);
return Response.ok().build();
}
@PUT
@Path("/place/{placeId}/reserve/{eventuserId}")
public Response reserve(@PathParam("placeId") Integer placeId, @PathParam("eventuserId") Integer eventuserId) {
Place place = eventmapbean.findPlace(placeId);
EventUser eventuser = eventuserbean.findByEventUserId(eventuserId);
if (placebean.reservePlace(place, eventuser))
{
try {
placebean.buySelectedPlaces(eventuser);
return Response.ok().build();
} catch (BortalCatchableException e) {
logger.warn("Wtf! Bortalerror");
}
}
return Response.serverError().build();
}
private void setPlaceValues(Place place, PlaceInputPojo update) { private void setPlaceValues(Place place, PlaceInputPojo update) {
if (update.getName() != null) if (update.getName() != null)
......
package fi.codecrew.moya.rest; package fi.codecrew.moya.rest;
import java.util.List;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
...@@ -42,6 +44,26 @@ public class ReaderRestView { ...@@ -42,6 +44,26 @@ public class ReaderRestView {
return new ReaderRestRoot(ReaderRestPojo.parse(readerbean.getReaders())); return new ReaderRestRoot(ReaderRestPojo.parse(readerbean.getReaders()));
} }
/**
* Returns events after the designated eventid. If eventid == 0 return last
* 20, eventid < 0 return all
*/
@GET
@Path("/readerevents/{readerId}/{eventId}")
public ReaderEventRestRoot getReaderevents(@PathParam("readerId") Integer readerId, @PathParam("eventId") Integer eventId) {
List<ReaderEvent> events = null;
if (eventId != null && eventId > 0) {
events = readerbean.getReaderEventsAfterEvent(readerId, eventId);
} else {
int count = 20;
if (eventId == null || eventId == 0)
count = 0;
events = readerbean.getReaderEvents(readerId, count);
}
return new ReaderEventRestRoot(ReaderEventRestPojo.parse(events));
}
@GET @GET
@Path("/LastEventusers") @Path("/LastEventusers")
public ReaderEventRestRoot getLastEventusers() public ReaderEventRestRoot getLastEventusers()
......
...@@ -2,6 +2,7 @@ package fi.codecrew.moya.rest.pojo; ...@@ -2,6 +2,7 @@ package fi.codecrew.moya.rest.pojo;
public class PlaceInputPojo { public class PlaceInputPojo {
private Integer id;
private String name; private String name;
private Integer mapX; private Integer mapX;
private Integer mapY; private Integer mapY;
...@@ -11,6 +12,7 @@ public class PlaceInputPojo { ...@@ -11,6 +12,7 @@ public class PlaceInputPojo {
private Boolean disabled; private Boolean disabled;
private Integer productId; private Integer productId;
private Integer mapId; private Integer mapId;
private Boolean taken;
public String getName() { public String getName() {
return name; return name;
...@@ -84,4 +86,20 @@ public class PlaceInputPojo { ...@@ -84,4 +86,20 @@ public class PlaceInputPojo {
this.mapId = mapId; this.mapId = mapId;
} }
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Boolean getTaken() {
return taken;
}
public void setTaken(Boolean taken) {
this.taken = taken;
}
} }
...@@ -112,6 +112,15 @@ public class PlaceOutPojo { ...@@ -112,6 +112,15 @@ public class PlaceOutPojo {
} }
@XmlElement @XmlElement
public Integer getMapId() {
Integer ret = null;
if (place.getMap() != null) {
ret = place.getMap().getId();
}
return ret;
}
@XmlElement
public Integer getEventuserId() public Integer getEventuserId()
{ {
Integer ret = null; Integer ret = null;
......
...@@ -76,4 +76,12 @@ public class ReaderEventRestPojo { ...@@ -76,4 +76,12 @@ public class ReaderEventRestPojo {
} }
return ret; return ret;
} }
public PrintedCardRestPojo getPrintedCard() {
return printedCard;
}
public void setPrintedCard(PrintedCardRestPojo printedCard) {
this.printedCard = printedCard;
}
} }
...@@ -60,7 +60,8 @@ public class PlaceMap extends HttpServlet { ...@@ -60,7 +60,8 @@ public class PlaceMap extends HttpServlet {
private static final String PARAMETER_EVENT_MAP_ID = "mapid"; private static final String PARAMETER_EVENT_MAP_ID = "mapid";
/** /**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
* *
* @param request * @param request
* servlet request * servlet request
...@@ -246,7 +247,7 @@ public class PlaceMap extends HttpServlet { ...@@ -246,7 +247,7 @@ public class PlaceMap extends HttpServlet {
} }
Color color = null; Color color = null;
if (!p.isBuyable()) { if (!p.isBuyable()) {
logger.info("Locking place."); logger.debug("Setting color as locked place.");
color = LOCKED_COLOR; color = LOCKED_COLOR;
} }
...@@ -272,7 +273,7 @@ public class PlaceMap extends HttpServlet { ...@@ -272,7 +273,7 @@ public class PlaceMap extends HttpServlet {
logger.error("Cannot convert string {} to color.", p.getProduct().getColor()); logger.error("Cannot convert string {} to color.", p.getProduct().getColor());
} }
} else { } else {
logger.info("Nothing special for this place. Color should be default."); logger.debug("Nothing special for this place. Color should be default.");
} }
......
...@@ -91,12 +91,18 @@ public class PrimeMenuView extends GenericCDIView { ...@@ -91,12 +91,18 @@ public class PrimeMenuView extends GenericCDIView {
{ {
menuModel = new DefaultMenuModel(); menuModel = new DefaultMenuModel();
MenuNavigation selectedTop = layoutview.getSelectedTopmenu(); MenuNavigation selectedTop = layoutview.getSelectedTopmenu();
if (selectedTop == null)
if (selectedTop == null) {
return null; return null;
}
int testid = 3;
for (MenuNavigation m : selectedTop.getChildren()) { for (MenuNavigation m : selectedTop.getChildren()) {
if (m.getItem() != null && m.getChildren().isEmpty()) { if (m.getItem() != null && m.getChildren().isEmpty()) {
DefaultMenuItem menuitem = mkMenuitem(m); DefaultMenuItem menuitem = mkMenuitem(m);
if (menuitem != null) { if (menuitem != null) {
menuModel.addElement(menuitem); menuModel.addElement(menuitem);
} }
......
...@@ -44,14 +44,19 @@ public class UserCartView extends GenericCDIView { ...@@ -44,14 +44,19 @@ public class UserCartView extends GenericCDIView {
public StreamedContent getDownloadCsv() { public StreamedContent getDownloadCsv() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("firstname").append(CSV_SEPARATOR); sb.append("Firstname").append(CSV_SEPARATOR);
sb.append("lastname").append(CSV_SEPARATOR); sb.append("Lastname").append(CSV_SEPARATOR);
sb.append("nick").append(CSV_SEPARATOR); sb.append("Nick").append(CSV_SEPARATOR);
sb.append("login").append(CSV_SEPARATOR); sb.append("Login").append(CSV_SEPARATOR);
sb.append("birthday").append(CSV_SEPARATOR); sb.append("Birthday").append(CSV_SEPARATOR);
sb.append("phone").append(CSV_SEPARATOR); sb.append("Age").append(CSV_SEPARATOR);
sb.append("email").append(CSV_SEPARATOR); sb.append("Phone").append(CSV_SEPARATOR);
sb.append("places").append(CSV_SEPARATOR); sb.append("Email").append(CSV_SEPARATOR);
sb.append("Street").append(CSV_SEPARATOR);
sb.append("Zip").append(CSV_SEPARATOR);
sb.append("City").append(CSV_SEPARATOR);
sb.append("Places").append(CSV_SEPARATOR);
sb.append("\n"); sb.append("\n");
for (EventUser uc : usercart) for (EventUser uc : usercart)
{ {
...@@ -60,8 +65,12 @@ public class UserCartView extends GenericCDIView { ...@@ -60,8 +65,12 @@ public class UserCartView extends GenericCDIView {
sb.append(uc.getNick()).append(CSV_SEPARATOR); sb.append(uc.getNick()).append(CSV_SEPARATOR);
sb.append(uc.getLogin()).append(CSV_SEPARATOR); sb.append(uc.getLogin()).append(CSV_SEPARATOR);
sb.append(uc.getBirthday() != null ? dateformat.format(uc.getBirthday()) : "").append(CSV_SEPARATOR); sb.append(uc.getBirthday() != null ? dateformat.format(uc.getBirthday()) : "").append(CSV_SEPARATOR);
sb.append(uc.getUser().getAge()).append(CSV_SEPARATOR);
sb.append(uc.getPhone()).append(CSV_SEPARATOR); sb.append(uc.getPhone()).append(CSV_SEPARATOR);
sb.append(uc.getEmail()).append(CSV_SEPARATOR); sb.append(uc.getEmail()).append(CSV_SEPARATOR);
sb.append(uc.getAddress()).append(CSV_SEPARATOR);
sb.append(uc.getZip()).append(CSV_SEPARATOR);
sb.append(uc.getUser().getTown()).append(CSV_SEPARATOR);
for (GroupMembership gm : uc.getGroupMemberships()) for (GroupMembership gm : uc.getGroupMemberships())
{ {
if (gm.getPlaceReservation() != null) if (gm.getPlaceReservation() != null)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!