Commit 8c607a95 by Tuomas Riihimäki

Merge branch 'master' into groupmgmt

2 parents b45286ac 8a2b16a8
Showing with 352 additions and 105 deletions
......@@ -109,4 +109,12 @@ public class EventMapBean implements EventMapBeanLocal {
public Place updatePlace(Place 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 {
userkauppa.addPage(menuitemfacade.findOrCreate("/shop/createBill"), BillPermission.CREATE_BILL);
userkauppa.addPage(menuitemfacade.findOrCreate("/foodwave/list"), ShopPermission.SHOP_FOODWAVE);
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);
MenuNavigation userPlaces = usermenu.addPage(null, null);
userPlaces.setKey("topnavi.userplaces");
userPlaces.addPage(menuitemfacade.findOrCreate("/place/placemap"), MapPermission.VIEW);
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);
usercompetitions.setKey("topnavi.competitions");
......
......@@ -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
* place to be reserved
......@@ -196,24 +197,33 @@ public class PlaceBean implements PlaceBeanLocal {
place = placeFacade.find(place.getId());
user = eventUserFacade.find(user.getId());
boolean ret = false;
if (place.isBuyable() && !place.isTaken()) {
place.setCurrentUser(user);
place.setReleaseTime(Calendar.getInstance());
place.getReleaseTime().add(Calendar.MINUTE, RESERVE_MINUTES);
// Create timeout service to timeout the reserved place in
// RESERVE_MINUTES
boolean foundTimeout = false;
for (Timer t : ts.getTimers()) {
if (t.getInfo().equals(PLACE_RESERVE_TIMEOUTER)) {
foundTimeout = true;
// 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.setReleaseTime(Calendar.getInstance());
place.getReleaseTime().add(Calendar.MINUTE, RESERVE_MINUTES);
// Create timeout service to timeout the reserved place in
// RESERVE_MINUTES
boolean foundTimeout = false;
for (Timer t : ts.getTimers()) {
if (t.getInfo().equals(PLACE_RESERVE_TIMEOUTER)) {
foundTimeout = true;
}
}
if (!foundTimeout) {
logger.info("Place timeout calculator not started. Starting new.");
ts.createTimer(new Date(), 1000 * 60, PLACE_RESERVE_TIMEOUTER);
}
ret = true;
}
if (!foundTimeout) {
logger.info("Place timeout calculator not started. Starting new.");
ts.createTimer(new Date(), 1000 * 60, PLACE_RESERVE_TIMEOUTER);
}
ret = true;
}
return ret;
}
......
......@@ -34,20 +34,19 @@ import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.PlaceGroup;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.BarcodeUtils;
import fi.codecrew.moya.utilities.I18n;
/**
* Session Bean implementation class PlaceGroupBean
*/
@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 {
private static final Logger logger = LoggerFactory.getLogger(PlaceGroupBean.class);
private static final int YSTART = 30;
@EJB
private EventBeanLocal eventbean;
@EJB
private BarcodeBeanLocal barcodeBean;
......@@ -87,7 +86,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// }
@Override
@RolesAllowed(SpecialPermission.S_USER)
@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<GroupMembership> getMembershipsAndCreations(EventUser user) {
if (user == null) {
user = permbean.getCurrentUser();
......@@ -99,7 +98,7 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<GroupMembership> getMemberships(EventUser user) {
if (user == null) {
user = permbean.getCurrentUser();
......@@ -133,59 +132,57 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public void getGroupMembershipPdf(EventUser usr, OutputStream ostream) {
List<GroupMembership> memberships = getMembershipsAndCreations(usr);
LanEventProperty tmpProperty = eventbean.getProperty(LanEventPropertyKey.PLACECODE_FROM_USER);
boolean placecodeFromUser = false;
if (tmpProperty != null && tmpProperty.isBooleanValue())
{
placecodeFromUser = true;
}
tmpProperty = eventbean.getProperty(LanEventPropertyKey.PLACECODE_PRINT_ONLY_OWN);
boolean printOnlyOwn = false;
if (tmpProperty != null && tmpProperty.isBooleanValue())
{
printOnlyOwn = true;
}
try {
PDF pdf = new PDF(ostream);
Font font = new Font(pdf, CoreFont.TIMES_ROMAN);
Font bigfont = new Font(pdf, CoreFont.TIMES_ROMAN);
bigfont.setSize(15);
Font titlefont = new Font(pdf, CoreFont.TIMES_ROMAN);
titlefont.setSize(20);
Page page = new Page(pdf, A4.PORTRAIT);
int y = YSTART;
String titletext = "Lipputositteet";
if(printOnlyOwn || memberships.size() <= 1) {
if (printOnlyOwn || memberships.size() <= 1) {
titletext = "Lipputosite";
}
TextLine topic = new TextLine(titlefont, titletext);
topic.setPosition(230, y);
topic.drawOn(page);
y += 30;
for (GroupMembership membership : memberships) {
if (y > 750) {
page = new Page(pdf, A4.PORTRAIT);
y = YSTART;
}
if(printOnlyOwn && (membership.getUser() == null || !membership.getUser().equals(usr))) {
if (printOnlyOwn && (membership.getUser() == null || !membership.getUser().equals(usr))) {
continue;
}
......@@ -194,16 +191,16 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
// PNGImage(BarcodeBean.getBarcode(membership.getInviteToken()));
// logger.debug("Jpeg: " + jpeg.getWidth() + " h. " +
// jpeg.getHeight());
if(placecodeFromUser) {
if(membership.getUser() != null) {
if (placecodeFromUser) {
if (membership.getUser() != null) {
Image image = new Image(pdf, barcodeBean.getUserBarcode(membership.getUser()), ImageType.PNG);
image.scaleBy(0.8);
image.setPosition(50, y);
image.drawOn(page);
} else {
TextLine nouser = new TextLine(bigfont, "EMPTY PLACE" );
nouser.setPosition(85, y+10);
TextLine nouser = new TextLine(bigfont, "EMPTY PLACE");
nouser.setPosition(85, y + 10);
nouser.drawOn(page);
}
} else {
......@@ -212,8 +209,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
image.setPosition(50, y);
image.drawOn(page);
}
StringBuilder sb = new StringBuilder();
if (membership.getPlaceReservation().getName() != null)
......@@ -246,24 +241,22 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
y += 130;
}
if (y > 750) {
page = new Page(pdf, A4.PORTRAIT);
y = YSTART;
}
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.";
}
TextLine footer = new TextLine(font, footertext);
footer.setPosition(50, y);
footer.drawOn(page);
pdf.flush();
} catch (Exception e) {
logger.info("Error getting printing group memberships", e);
......@@ -272,19 +265,20 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
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))) {
loggerbean.logMessage(SecurityLogType.permissionDenied, permbean.getCurrentUser(), "User tried to release and generate group membership: " + gmem);
throw new EJBAccessException("Not enough rights to release token");
}
gmem.setUser(null);
gmem.setInviteToken(gmemfacade.createInviteToken());
logger.info("Place released. {} new token {}", gmem.getInviteToken());
}
@Override
@RolesAllowed(SpecialPermission.S_USER)
@RolesAllowed({ SpecialPermission.S_USER, MapPermission.S_MANAGE_MAPS })
public List<PlaceGroup> getPlacegroups(EventUser user) {
return pgfacade.find(user);
}
......@@ -299,6 +293,6 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
public void markGrouMembershipNotEntered(GroupMembership membership) {
membership.setEnteredEvent(null);
membership = gmemfacade.merge(membership);
}
}
......@@ -202,8 +202,13 @@ public class ReaderBean implements ReaderBeanLocal {
@Override
public List<ReaderEvent> getReaderEvents(Integer readerId) {
return getReaderEvents(readerId, 20);
}
@Override
public List<ReaderEvent> getReaderEvents(Integer readerId, Integer count) {
Reader reader = readerfacade.find(readerId);
return readerEventFacade.findLastEvents(reader, 20);
return readerEventFacade.findLastEvents(reader, count);
}
@Override
......@@ -294,4 +299,9 @@ public class ReaderBean implements ReaderBeanLocal {
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> {
cq.orderBy(cb.desc(root.get(ReaderEvent_.time)));
TypedQuery<ReaderEvent> q = getEm().createQuery(cq);
q.setMaxResults(count);
if (count > 0) {
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();
}
}
......@@ -24,4 +24,6 @@ public interface EventMapBeanLocal {
Place updatePlace(Place place);
void createPlace(Place create);
}
......@@ -41,4 +41,8 @@ public interface ReaderBeanLocal {
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;
import java.math.BigDecimal;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
......@@ -24,9 +26,13 @@ import javax.validation.constraints.NotNull;
import org.eclipse.persistence.annotations.OptimisticLocking;
import org.eclipse.persistence.annotations.OptimisticLockingType;
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.LoggerFactory;
import com.sun.xml.ws.commons.xmlutil.Converter;
import fi.codecrew.moya.enums.Gender;
import fi.codecrew.moya.utilities.PasswordFunctions;
......@@ -365,6 +371,42 @@ public class User extends GenericEntity implements IUser {
public void setLicenseCodes(List<LicenseCode> 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() {
StringBuilder sb = new StringBuilder();
......
<!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"
xmlns:f="http://java.sun.com/jsf/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"
>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/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>
......
......@@ -100,6 +100,12 @@
<h:outputText value="#{user.firstnames}" />
</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:column>
</h:dataTable>
......
......@@ -86,59 +86,90 @@
<table>
<ui:fragment rendered="#{!cc.attrs.creating}">
<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>
</ui:fragment>
<tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.nick']}" for="nick" /> <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:inplace></td>
<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:inplace>
</td>
</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:inplace></td>
<td><h:outputLabel value="#{i18n['user.lastName']}" for="lastname" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
</p:inplace>
</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:inplace></td>
</p:inplace>
</td>
</tr>
<tr>
<td><h:outputLabel for="birthday" value="#{i18n['user.birthday']}" /><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><h:outputLabel value="#{i18n['user.sex']}" for="sex" /> <br /> <p:selectOneMenu disabled="#{!cc.attrs.creating and !userView.canSave}" id="sex" value="#{userView.selectedUser.gender}">
<td colspan="2"><b><h:outputLabel value="#{i18n['user.sex']}" for="sex" /></b> <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="male" itemLabel="#{i18n['user.sex.MALE']}" itemValue="MALE" />
<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>
</table>
<table>
<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:inplace></td>
</p:inplace>
</td>
</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:inplace> <p:message for="zip" /></td>
<td><p:outputLabel value="#{i18n['user.town']}" for="town" /><br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
</p:inplace> <p:message for="zip" />
</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:inplace> <p:message for="town" /></td>
</p:inplace> <p:message for="town" />
</td>
</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:inplace></td>
</p:inplace>
</td>
</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:inplace> <p:message for="phone" /></td>
</p:inplace> <p:message for="phone" />
</td>
</tr>
</table>
......
......@@ -103,7 +103,7 @@
<nav>
<div id="menu">
<p:panelMenu model="#{primeMenuView.menuModel}" />
<p:panelMenu model="#{primeMenuView.menuModel}" />
<h:link style="font-size: 10px;" rendered="#{readerView.shopToOthers}" outcome="/shop/showReaderEvents" value="Readers" />
</div>
</nav>
......
......@@ -1153,6 +1153,7 @@ user.accountBalance = Account balance
user.accountEventHeader = Account events
user.accountevents = Account events
user.address = Address
user.age = Age
user.bank = Bank
user.bankaccount = Bank number
user.birthday = Birthday
......
......@@ -1138,9 +1138,10 @@ user.accountBalance = Tilin saldo
user.accountEventHeader = Tilitapahtumat
user.accountevents = Tilitapahtumat
user.address = Osoite
user.age = Ik
user.bank = Pankki
user.bankaccount = Pankkitili
user.birthday = Syntym\u00E4p\u00E4iv\u00E4
user.birthday = Syntym\u00E4aika
user.cardPower = K\u00E4ytt\u00E4j\u00E4tyyppi
user.changePassword = Vaihda salasana
user.changepassword.forUser = K\u00E4ytt\u00E4j\u00E4lle
......
......@@ -20,10 +20,14 @@ import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.EventMapBeanLocal;
import fi.codecrew.moya.beans.PlaceBeanLocal;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.PlaceMapBeanLocal;
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.EventUser;
import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.Product;
import fi.codecrew.moya.rest.pojo.MapRoot;
......@@ -47,6 +51,11 @@ public class MapAdminView {
private EventBeanLocal eventbean;
@EJB
private ProductBeanLocal productbean;
@EJB
private UserBeanLocal eventuserbean;
@EJB
private transient PlaceBeanLocal placebean;
private static final Logger logger = LoggerFactory.getLogger(MapAdminView.class);
@GET
......@@ -86,8 +95,10 @@ public class MapAdminView {
@POST
@Path("/place/")
public Response createPlace(PlaceInputPojo create) {
logger.info("Finding map with id {}", create.getMapId());
EventMap map = eventmapbean.find(create.getMapId());
if (map == null) {
logger.warn("No map found!");
return Response.serverError().entity("Error with mapId").build();
}
Place place = new Place();
......@@ -95,7 +106,8 @@ public class MapAdminView {
setPlaceValues(place, create);
if (create.getProductId() != null && (place.getProduct() == null || !place.getProduct().getId().equals(create.getProductId())))
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();
}
......@@ -117,6 +129,36 @@ public class MapAdminView {
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) {
if (update.getName() != null)
......
package fi.codecrew.moya.rest;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.Consumes;
......@@ -42,6 +44,26 @@ public class ReaderRestView {
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
@Path("/LastEventusers")
public ReaderEventRestRoot getLastEventusers()
......
......@@ -2,6 +2,7 @@ package fi.codecrew.moya.rest.pojo;
public class PlaceInputPojo {
private Integer id;
private String name;
private Integer mapX;
private Integer mapY;
......@@ -11,6 +12,7 @@ public class PlaceInputPojo {
private Boolean disabled;
private Integer productId;
private Integer mapId;
private Boolean taken;
public String getName() {
return name;
......@@ -84,4 +86,20 @@ public class PlaceInputPojo {
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 {
}
@XmlElement
public Integer getMapId() {
Integer ret = null;
if (place.getMap() != null) {
ret = place.getMap().getId();
}
return ret;
}
@XmlElement
public Integer getEventuserId()
{
Integer ret = null;
......
......@@ -76,4 +76,12 @@ public class ReaderEventRestPojo {
}
return ret;
}
public PrintedCardRestPojo getPrintedCard() {
return printedCard;
}
public void setPrintedCard(PrintedCardRestPojo printedCard) {
this.printedCard = printedCard;
}
}
......@@ -60,7 +60,8 @@ public class PlaceMap extends HttpServlet {
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
* servlet request
......@@ -246,7 +247,7 @@ public class PlaceMap extends HttpServlet {
}
Color color = null;
if (!p.isBuyable()) {
logger.info("Locking place.");
logger.debug("Setting color as locked place.");
color = LOCKED_COLOR;
}
......@@ -272,7 +273,7 @@ public class PlaceMap extends HttpServlet {
logger.error("Cannot convert string {} to color.", p.getProduct().getColor());
}
} 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 {
{
menuModel = new DefaultMenuModel();
MenuNavigation selectedTop = layoutview.getSelectedTopmenu();
if (selectedTop == null)
if (selectedTop == null) {
return null;
}
int testid = 3;
for (MenuNavigation m : selectedTop.getChildren()) {
if (m.getItem() != null && m.getChildren().isEmpty()) {
DefaultMenuItem menuitem = mkMenuitem(m);
if (menuitem != null) {
menuModel.addElement(menuitem);
}
......
......@@ -44,14 +44,19 @@ public class UserCartView extends GenericCDIView {
public StreamedContent getDownloadCsv() {
StringBuilder sb = new StringBuilder();
sb.append("firstname").append(CSV_SEPARATOR);
sb.append("lastname").append(CSV_SEPARATOR);
sb.append("nick").append(CSV_SEPARATOR);
sb.append("login").append(CSV_SEPARATOR);
sb.append("birthday").append(CSV_SEPARATOR);
sb.append("phone").append(CSV_SEPARATOR);
sb.append("email").append(CSV_SEPARATOR);
sb.append("places").append(CSV_SEPARATOR);
sb.append("Firstname").append(CSV_SEPARATOR);
sb.append("Lastname").append(CSV_SEPARATOR);
sb.append("Nick").append(CSV_SEPARATOR);
sb.append("Login").append(CSV_SEPARATOR);
sb.append("Birthday").append(CSV_SEPARATOR);
sb.append("Age").append(CSV_SEPARATOR);
sb.append("Phone").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");
for (EventUser uc : usercart)
{
......@@ -60,8 +65,12 @@ public class UserCartView extends GenericCDIView {
sb.append(uc.getNick()).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.getUser().getAge()).append(CSV_SEPARATOR);
sb.append(uc.getPhone()).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())
{
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!