Commit 689ee963 by Tuomas Riihimäki

Add 'Role shopRequiredRole' to Product entity

1 parent 036e500e
......@@ -280,6 +280,10 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE vips ADD shortdescr TEXT"
});
dbUpdates.add(new String[] {
"ALTER TABLE products ADD shop_required_role INTEGER",
"ALTER TABLE products ADD CONSTRAINT FK_products_shop_required_role FOREIGN KEY (shop_required_role) REFERENCES roles (id)",
});
}
public BootstrapBean() {
......
......@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
......@@ -156,7 +157,15 @@ public class ProductBean implements ProductBeanLocal {
@Override
@RolesAllowed(ShopPermission.S_LIST_USERPRODUCTS)
public List<Product> listUserShoppableProducts() {
return productFacade.findProductsByFlag(ProductFlag.USER_SHOPPABLE);
List<Product> ret = productFacade.findProductsByFlag(ProductFlag.USER_SHOPPABLE);
Iterator<Product> i = ret.iterator();
while (i.hasNext()) {
Product p = i.next();
if (p.getShopRequiredRole() != null && !(userbean.isUserInRole(permbean.getCurrentUser(), p.getShopRequiredRole().getId()))) {
i.remove();
}
}
return ret;
}
@Override
......@@ -269,7 +278,7 @@ public class ProductBean implements ProductBeanLocal {
if (s.getBill() == null || s.getBill().isPaid()) {
++unusedSlotcount;
} else {
// If bill is paid, calculate only 'unpaidSlotpercent'% of slots
Integer billcnt = unpaidBills.get(s.getBill().getId());
if (billcnt == null) {
......
......@@ -86,6 +86,10 @@ public class Product extends GenericEntity {
@ManyToOne
private Role provides;
@ManyToOne
@JoinColumn(name = "shop_required_role", nullable = true)
private Role shopRequiredRole;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product")
private List<Place> places;
......@@ -367,4 +371,12 @@ public class Product extends GenericEntity {
return getProductFlags().contains(ProductFlag.USERSHOP_AUTOPRODUCT);
}
public Role getShopRequiredRole() {
return shopRequiredRole;
}
public void setShopRequiredRole(Role shopRequiredRole) {
this.shopRequiredRole = shopRequiredRole;
}
}
......@@ -54,6 +54,11 @@
</h:selectOneMenu>
<h:message for="provides" />
<h:outputLabel for="shopRequired" value="#{i18n['product.shopRequired']}" />
<h:selectOneMenu id="shopRequired" layout="pageDirection" value="#{productView.product.shopRequiredRole}" converter="#{roleConverter}">
<f:selectItems var="role" itemLabel="#{role.name}" value="#{roleDataView.rolesWithEmpty}" noSelectionValue="#{roleDataView.noSelection}" />
</h:selectOneMenu>
<h:message for="shopRequired" />
<h:selectManyCheckbox layout="pageDirection" id="productFlags" value="#{productView.product.productFlags}" converter="#{productFlagConverter}" label="Product Flags">
<f:selectItems var="flag" itemLabel="#{i18n[flag.i18nkey]}" value="#{productView.productFlags}" />
......
......@@ -61,6 +61,7 @@ bortalApplication.SALESPOINT = Managing salespoint
bortalApplication.SHOP = Product % shop management
bortalApplication.TERMINAL = Sales and self help terminal roles
bortalApplication.USER = User management related
bortalApplication.VIP = VIP list
bortalApplication.bill.CREATE_BILL = Create bills for self
bortalApplication.bill.CREATE_VERKKOMAKSU = Can create web payment to self
bortalApplication.bill.READ_ALL = "Read all bills"
......@@ -76,6 +77,7 @@ bortalApplication.content.MANAGE_NEWS = Manage newsgroups
bortalApplication.content.MANAGE_PAGES = Manage pages
bortalApplication.event.MANAGE_PRIVATE_PROPERTIES = Can manage event private properties
bortalApplication.event.MANAGE_PROPERTIES = Can manage event properties
bortalApplication.event.VIEW_STATISTICS = View event statistics
bortalApplication.license.MANAGE = Can manage licenses
bortalApplication.license.VIEW_OWN_CODES = Can view own licenses
bortalApplication.map.BUY_PLACES = Reserve and buy places from map
......@@ -119,14 +121,24 @@ bortalApplication.user.VIEW_SELF = Can view self
bortalApplication.user.VITUTTAAKO = Can send feedback
bortalApplication.user.WRITE_ORGROLES = Modify organization roles
bortalApplication.user.WRITE_ROLES = Modify roles
bortalApplication.vip.EDIT = Edit VIP list
bortalApplication.vip.USAGE = Use VIP list
bortalApplication.vip.VIEW = View VIP list
card.massprint.title = Print all
cardCode.code = Koodi
cardCode.type = Tyyppi
cardObjectData.delete = Delete
cardObjectData.deleteQ = Delete object data from card template?
cardTemplate.clone = Clone
cardTemplate.emptyCardTemplate = ----
cardTextData.delete = Delete
cardTextData.deleteQ = Delete text data from card template?
code.inputfield = Sy\u00F6t\u00E4 viivakoodi
confirmation.message = Oletko varma?
......@@ -177,6 +189,9 @@ eventdomain.domainname = Domain
eventdomain.remove = Remove
eventmap.active = Active
eventmap.height = Kartan korkeus (px)
eventmap.uploaderror = Virhe lis\u00E4tess\u00E4 karttapohjaa
eventmap.width = Kartan leveys (px)
eventorg.basicDetails = Perustiedot
eventorg.create = Create
......@@ -362,13 +377,15 @@ permissiondenied.notLoggedIn = You don't have enough rights to enter this si
place.cancelSend = Peruuta siirto
place.send = Siirr\u00E4 paikka
placegroup.showEticket = N\u00E4yt\u00E4 lippu
placegroup.noPlacegroups = Sinulla t\u00E4ytyy olla paikkoja ett\u00E4 voit n\u00E4hd\u00E4 lippusi
placegroup.showEticket = N\u00E4yt\u00E4 lippu
placegroupview.groupCreator = Tilaaja
placegroupview.owner = Omistaja
placegroupview.placetransferred = Paikka annettu eteenp\u00E4in
placegroupview.toptext = \
placeslot.add = Lis\u00E4\u00E4 placeslot
placeslot.state.expired = Vanhentunut
poll.edit = edit
......@@ -430,6 +447,8 @@ submenu.info.foodwave.foodwaveshop = Ruokakauppa
submenu.info.incoming = Laaja sis\u00E4\u00E4ntulon\u00E4kym\u00E4
submenu.info.index = Infon\u00E4kym\u00E4
submenu.info.shop = Kauppa
submenu.info.usermapsearch = Karttahaku
submenu.info.viplist = Vippilista
submenu.lectureadmin.lectureParticipants = Tarkastele osallistujia
submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu
......@@ -487,17 +506,18 @@ usercart.showoverview = Vie tarkastusn\u00E4kym\u00E4\u00E4n
viewlectures.title = Kurssit ja luennot
vip.create = Luo
vip.createNew = Luo uusi
vip.deliver = Toimita
vip.backToList = Takaisin listaukseen
vip.create = Luo
vip.createNew = Luo uusi
vip.deliver = Toimita
vip.description = Kuvaus
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.productDelivered = Toimitettu
vip.productQuantity = Lkm
vip.products = Tuote
vip.save = Tallenna
vip.products = Tuote
vip.save = Tallenna
vip.shortdescr = Lyhyt kuvaus
vipProduct.create = Lis\u00E4\u00E4
......@@ -508,21 +528,3 @@ vipProduct.name = Tuote
vipProduct.quantity = Lukum\u00E4\u00E4r\u00E4
yes = Kyll\u00E4
vip.backToList=Takaisin listaukseen
submenu.info.viplist=Vippilista
submenu.info.usermapsearch=Karttahaku
cardTemplate.clone=Clone
cardObjectData.deleteQ=Delete object data from card template?
cardTextData.deleteQ=Delete text data from card template?
cardObjectData.delete=Delete
cardTextData.delete=Delete
placegroup.noPlacegroups=Sinulla t\u00E4ytyy olla paikkoja ett\u00E4 voit n\u00E4hd\u00E4 lippusi
bortalApplication.VIP=VIP list
bortalApplication.vip.VIEW=View VIP list
bortalApplication.vip.USAGE=Use VIP list
bortalApplication.vip.EDIT=Edit VIP list
bortalApplication.event.VIEW_STATISTICS=View event statistics
eventmap.width=Kartan leveys (px)
eventmap.height=Kartan korkeus (px)
eventmap.uploaderror=Virhe lis\u00E4tess\u00E4 karttapohjaa
placeslot.add=Lis\u00E4\u00E4 placeslot
......@@ -144,6 +144,7 @@ bortalApplication.SHOP = Product and shop management
bortalApplication.TERMINAL = Sales and self help terminal roles
bortalApplication.TOURNAMENT = Tournament permissions
bortalApplication.USER = User management related
bortalApplication.VIP = VIP list
bortalApplication.bill.CREATE_BILL = Create bills for self
bortalApplication.bill.CREATE_VERKKOMAKSU = Can create web payment to self
bortalApplication.bill.READ_ALL = Read all bills
......@@ -160,6 +161,7 @@ bortalApplication.content.MANAGE_PAGES = Manage pages
bortalApplication.event.MANAGE_EVENT = Can manage event
bortalApplication.event.MANAGE_PRIVATE_PROPERTIES = Can manage event private properties
bortalApplication.event.MANAGE_PROPERTIES = Can manage event properties
bortalApplication.event.VIEW_STATISTICS = View event statistics
bortalApplication.lecture.MANAGE = Can manage lectures and courses
bortalApplication.lecture.PARTICIPATE = Can participate to lectures and courses
bortalApplication.lecture.VIEW = Can view lectures and courses
......@@ -221,6 +223,9 @@ bortalApplication.user.VIEW_SELF = Can view self
bortalApplication.user.VITUTTAAKO = Can send feedback
bortalApplication.user.WRITE_ORGROLES = Modify organization roles
bortalApplication.user.WRITE_ROLES = Modify roles
bortalApplication.vip.EDIT = Edit VIP list
bortalApplication.vip.USAGE = Use VIP list
bortalApplication.vip.VIEW = View VIP list
card.massprint.title = Print all
......@@ -228,6 +233,8 @@ cardCode.code = Code
cardCode.type = Type
cardObjectData.create = Add object data
cardObjectData.delete = Delete
cardObjectData.deleteQ = Delete object data from card template?
cardObjectData.edit = Edit
cardObjectData.save = Save
cardObjectData.size = Width (px)
......@@ -240,19 +247,22 @@ cardObjectData.x = X coordinate
cardObjectData.y = Y coordinate
cardObjectData.zindex = Z index
cardTemplate.clone = Clone
cardTemplate.create = Create
cardTemplate.edit = Edit
cardTemplate.id = Id
cardTemplate.edit = Edit
cardTemplate.id = Id
cardTemplate.imageheader = Current Template
cardTemplate.name = Card template
cardTemplate.power = Card power
cardTemplate.roles = Associated roles
cardTemplate.save = Save
cardTemplate.name = Card template
cardTemplate.power = Card power
cardTemplate.roles = Associated roles
cardTemplate.save = Save
cardTemplate.sendImage = Upload Image
cardTemplateData.list = List datas
cardTextData.create = Add text data
cardTextData.delete = Delete
cardTextData.deleteQ = Delete text data from card template?
cardTextData.edit = Edit
cardTextData.fontcolor = Font color
cardTextData.fontname = Font name
......@@ -391,9 +401,12 @@ eventmap.active = Active
eventmap.buyable.like = Place name match
eventmap.buyable.lock = Lock places
eventmap.buyable.release = Release places
eventmap.height = Map height (px)
eventmap.name = Map name
eventmap.notes = Notes
eventmap.save = Save
eventmap.uploaderror = Error when adding map
eventmap.width = Map width (px)
eventorg.bankName1 = Bank name 2
eventorg.bankName2 = Bank name 2
......@@ -942,6 +955,7 @@ placegroup.details = Details
placegroup.edit = Show
placegroup.edited = Edited
placegroup.name = Name
placegroup.noPlacegroups = You must have placegroups that you can have places
placegroup.placename = Place
placegroup.places = Places
placegroup.printPdf = Print tickets
......@@ -961,8 +975,9 @@ placegroupview.reservationName = Place
placegroupview.reservationProduct = Ticket
placegroupview.token = Placecode / user
placeslot.add = Add placeslot
placeslot.bill = Bill
placeslot.id = ID
placeslot.id = ID
placeslot.lockSlot = Lock slot
placeslot.place = Place
placeslot.product = Slot product
......@@ -1023,6 +1038,7 @@ product.returnProductEdit = Return to product:
product.save = Save
product.saved = Product saved
product.shopInstant = Create automatic cashpayment
product.shopRequired = Role required to buy this product
product.sort = Sort nr
product.totalPrice = Total
product.unitName = Unit name
......@@ -1268,6 +1284,8 @@ submenu.info.foodwave.foodwaveshop = Foodshop
submenu.info.incoming = Extendet Incomingview
submenu.info.index = Infoview
submenu.info.shop = Shop
submenu.info.usermapsearch = Mapsearch
submenu.info.viplist = Viplist
submenu.lectureadmin.lectureParticipants = Lecture participants
submenu.lectureadmin.manageLectureGroups = Management
submenu.lectures.viewLectures = Participate
......@@ -1662,17 +1680,18 @@ viewexpired.title = Login expired. Please login again.
viewlectures.title = Courses and lectures
vip.create = Create
vip.createNew = Create new
vip.deliver = Deliver
vip.backToList = Back to viplist list
vip.create = Create
vip.createNew = Create new
vip.deliver = Deliver
vip.description = Description
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.edit = Edit
vip.host = Host
vip.hostsName = Host
vip.productDelivered = Delivered
vip.productQuantity = Qty
vip.products = Product
vip.save = Save
vip.products = Product
vip.save = Save
vip.shortdescr = Short description
vipProduct.create = Create
......@@ -1725,21 +1744,3 @@ voting.create.voteEnd = Voting close
voting.create.voteStart = Voting start
yes = Yes
vip.backToList=Back to viplist list
submenu.info.viplist=Viplist
submenu.info.usermapsearch=Mapsearch
cardTemplate.clone=Clone
cardObjectData.deleteQ=Delete object data from card template?
cardTextData.deleteQ=Delete text data from card template?
cardObjectData.delete=Delete
cardTextData.delete=Delete
placegroup.noPlacegroups=You must have placegroups that you can have places
bortalApplication.VIP=VIP list
bortalApplication.vip.VIEW=View VIP list
bortalApplication.vip.USAGE=Use VIP list
bortalApplication.vip.EDIT=Edit VIP list
bortalApplication.event.VIEW_STATISTICS=View event statistics
eventmap.width=Map width (px)
eventmap.height=Map height (px)
eventmap.uploaderror=Error when adding map
placeslot.add=Add placeslot
......@@ -146,6 +146,7 @@ bortalApplication.SHOP = Kaupan oikeudet
bortalApplication.TERMINAL = K\u00E4ytt\u00F6p\u00E4\u00E4tteiden roolit
bortalApplication.TOURNAMENT = Turnauksien oikeudet
bortalApplication.USER = K\u00E4ytt\u00E4j\u00E4oikeudet
bortalApplication.VIP = VIP-lista
bortalApplication.bill.CREATE_BILL = Voi luoda laskuja itselle
bortalApplication.bill.CREATE_VERKKOMAKSU = Voi luoda verkkomaksun itselleen
bortalApplication.bill.READ_ALL = Saa lukea kaikkia laskuja
......@@ -162,6 +163,7 @@ bortalApplication.content.MANAGE_PAGES = Saa hallinnoida sivuja
bortalApplication.event.MANAGE_EVENT = Saa hallinnoida tapahtumaa
bortalApplication.event.MANAGE_PRIVATE_PROPERTIES = Saa hallita tapahtuman yksityisi\u00E4 asetuksia
bortalApplication.event.MANAGE_PROPERTIES = Saa hallita tapahtuman asetuksia
bortalApplication.event.VIEW_STATISTICS = N\u00E4yt\u00E4 tapahtuman tilastot
bortalApplication.lecture.MANAGE = Saa hallinnoida kursseja ja luentoja
bortalApplication.lecture.PARTICIPATE = Saa osallistua kursseille ja luennoille
bortalApplication.lecture.VIEW = Saa n\u00E4hd\u00E4 kurssit ja luennot
......@@ -223,6 +225,9 @@ bortalApplication.user.VIEW_SELF = Voi katsella omaa tunnusta
bortalApplication.user.VITUTTAAKO = Saa avautua
bortalApplication.user.WRITE_ORGROLES = Saa muokata organisaation rooleja
bortalApplication.user.WRITE_ROLES = Saa muokata rooleja
bortalApplication.vip.EDIT = Muokkaa VIP-listaa
bortalApplication.vip.USAGE = K\u00E4yt\u00E4 VIP-listaa
bortalApplication.vip.VIEW = N\u00E4yt\u00E4 VIP-lista
card.massprint.title = Tulosta kaikki
......@@ -230,6 +235,8 @@ cardCode.code = Koodi
cardCode.type = Tyyppi
cardObjectData.create = Liit\u00E4 kuvia
cardObjectData.delete = Poista
cardObjectData.deleteQ = Poistetaanko objektidata korttipohjalta?
cardObjectData.edit = Muokkaa
cardObjectData.save = Tallenna
cardObjectData.size = Leveys (px)
......@@ -242,19 +249,22 @@ cardObjectData.x = X koordinaatti
cardObjectData.y = Y koordinaatti
cardObjectData.zindex = Z index
cardTemplate.clone = Kopioi
cardTemplate.create = Luo
cardTemplate.edit = Muokkaa
cardTemplate.id = Id
cardTemplate.edit = Muokkaa
cardTemplate.id = Id
cardTemplate.imageheader = Nykyinen pohja
cardTemplate.name = Korttipohja
cardTemplate.power = Teho
cardTemplate.roles = Yhdistetyt roolit
cardTemplate.save = Tallenna
cardTemplate.name = Korttipohja
cardTemplate.power = Teho
cardTemplate.roles = Yhdistetyt roolit
cardTemplate.save = Tallenna
cardTemplate.sendImage = Lataa kuva
cardTemplateData.list = Ohjeissis\u00E4ll\u00F6n listaus
cardTextData.create = Liit\u00E4 teksti\u00E4
cardTextData.delete = Poista
cardTextData.deleteQ = Poistetaanko tekstidata korttipohjalta?
cardTextData.edit = Muokkaa
cardTextData.fontcolor = Fontin v\u00E4ri
cardTextData.fontname = Fontin nimi
......@@ -393,9 +403,12 @@ eventmap.active = Aktiivinen\u0009
eventmap.buyable.like = Paikat
eventmap.buyable.lock = Lukitse paikat
eventmap.buyable.release = Vapauta paikat
eventmap.height = Kartan korkeus (px)
eventmap.name = Kartan nimi
eventmap.notes = Lis\u00E4tiedot
eventmap.save = Tallenna
eventmap.uploaderror = Virhe lis\u00E4tt\u00E4ess\u00E4 karttapohjaa
eventmap.width = Kartan leveys (px)
eventorg.bankName1 = Pankin nimi 1
eventorg.bankName2 = Pankin nimi 2
......@@ -662,6 +675,7 @@ lecture.participating = Osallistumassa
lecture.roles = Roolit
lecture.saveLecture = Muokkaa
lecture.selectgroup = Valitse aihealue
lecture.showParticipants = N\u00E4yt\u00E4 osallistujat
lecture.startTime = Aloitusaika
lecture.unparticipate = Poista ilmoittautuminen
lecture.unparticipate.confirm.message = Oletko varma ett\u00E4 haluat poistaa k\u00E4ytt\u00E4j\u00E4n kurssilta?
......@@ -926,6 +940,7 @@ placegroup.details = Tiedot
placegroup.edit = N\u00E4yt\u00E4
placegroup.edited = Muokattu
placegroup.name = Nimi
placegroup.noPlacegroups = Sinulla t\u00E4ytyy olla paikkoja ett\u00E4 voit n\u00E4hd\u00E4 lippusi
placegroup.placename = Paikka
placegroup.places = Paikat
placegroup.printPdf = Tulosta lipputositteet
......@@ -945,8 +960,9 @@ placegroupview.reservationName = Paikka
placegroupview.reservationProduct = Lippu
placegroupview.token = Paikkakoodi / k\u00E4ytt\u00E4j\u00E4
placeslot.add = Lis\u00E4\u00E4 placeslot
placeslot.bill = Lasku
placeslot.id = ID
placeslot.id = ID
placeslot.lockSlot = Lukitse
placeslot.place = Paikka
placeslot.product = Tuote
......@@ -1007,6 +1023,7 @@ product.returnProductEdit = Palaa tuotteeseen:
product.save = Tallenna
product.saved = Tuote tallennettu
product.shopInstant = Luo k\u00E4teismaksu tuotteille
product.shopRequired = Tuotteen ostamiseen vaadittu rooli
product.sort = J\u00E4rjestys luku
product.totalPrice = Summa
product.unitName = Tuoteyksikk\u00F6
......@@ -1249,6 +1266,8 @@ submenu.info.foodwave.foodwaveshop = Ruokakauppa
submenu.info.incoming = Laaja Sis\u00E4\u00E4ntulon\u00E4kym\u00E4
submenu.info.index = Infon\u00E4kym\u00E4
submenu.info.shop = Kauppa
submenu.info.usermapsearch = Karttahaku
submenu.info.viplist = Vippilista
submenu.lectureadmin.lectureParticipants = Kurssiosallistujat
submenu.lectureadmin.manageLectureGroups = Hallinnoi
submenu.lectures.viewLectures = Ilmoittaudu
......@@ -1645,17 +1664,18 @@ viewexpired.title = N\u00E4kym\u00E4 on vanhentunut
viewlectures.title = Kurssit ja luennot
vip.create = Luo
vip.createNew = Luo uusi
vip.deliver = Toimita
vip.backToList = Takaisin listaukseen
vip.create = Luo
vip.createNew = Luo uusi
vip.deliver = Toimita
vip.description = Kuvaus
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.edit = Muokkaa
vip.host = Is\u00E4nt\u00E4
vip.hostsName = Is\u00E4nt\u00E4
vip.productDelivered = Toimitettu
vip.productQuantity = Lkm
vip.products = Tuote
vip.save = Tallenna
vip.products = Tuote
vip.save = Tallenna
vip.shortdescr = Lyhyt kuvaus
vipProduct.create = Lis\u00E4\u00E4
......@@ -1708,22 +1728,3 @@ voting.create.voteEnd = \u00C4\u00E4nestys kiinni
voting.create.voteStart = \u00C4\u00E4nestys auki
yes = Kyll\u00E4
vip.backToList=Takaisin listaukseen
submenu.info.viplist=Vippilista
submenu.info.usermapsearch=Karttahaku
cardTemplate.clone=Kopioi
cardObjectData.deleteQ=Poistetaanko objektidata korttipohjalta?
cardTextData.deleteQ=Poistetaanko tekstidata korttipohjalta?
cardObjectData.delete=Poista
cardTextData.delete=Poista
placegroup.noPlacegroups=Sinulla t\u00E4ytyy olla paikkoja ett\u00E4 voit n\u00E4hd\u00E4 lippusi
bortalApplication.VIP=VIP-lista
bortalApplication.vip.VIEW=N\u00E4yt\u00E4 VIP-lista
bortalApplication.vip.USAGE=K\u00E4yt\u00E4 VIP-listaa
bortalApplication.vip.EDIT=Muokkaa VIP-listaa
bortalApplication.event.VIEW_STATISTICS=N\u00E4yt\u00E4 tapahtuman tilastot
lecture.showParticipants=N\u00E4yt\u00E4 osallistujat
eventmap.width=Kartan leveys (px)
eventmap.height=Kartan korkeus (px)
eventmap.uploaderror=Virhe lis\u00E4tt\u00E4ess\u00E4 karttapohjaa
placeslot.add=Lis\u00E4\u00E4 placeslot
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!