summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHolger Cremer <HolgerCremer@gmail.com>2017-04-16 01:34:22 +0200
committerHolger Cremer <HolgerCremer@gmail.com>2017-04-16 01:34:22 +0200
commitf891ecc9fbe159ec8a6cf321c43217d59f8cdf02 (patch)
tree6f88f4ef2a2c59388487bbde25451cf7ee3eb34b /src
parent14a7c9ff8a785608c54cd38f50dc14686907889e (diff)
downloadserial-barcode-scanner-f891ecc9fbe159ec8a6cf321c43217d59f8cdf02.tar.bz2
adds a new feature: a user can select it's sond theme in the web interface. If not selected, a random theme is used.
Diffstat (limited to 'src')
-rw-r--r--src/audio/audio-interface.vala1
-rw-r--r--src/audio/audio.vala4
-rw-r--r--src/database/database.vala51
-rw-r--r--src/database/db-interface.vala3
-rw-r--r--src/scanner-session/scannersession.vala5
-rw-r--r--src/web/Makefile2
-rw-r--r--src/web/main.vala8
-rw-r--r--src/web/web.vala27
8 files changed, 80 insertions, 21 deletions
diff --git a/src/audio/audio-interface.vala b/src/audio/audio-interface.vala
index 89d4a6f..fe13af5 100644
--- a/src/audio/audio-interface.vala
+++ b/src/audio/audio-interface.vala
@@ -19,5 +19,6 @@ public interface AudioPlayer : Object {
public abstract void play_system(string file) throws IOError;
public abstract string get_random_user_theme() throws IOError;
+ public abstract string[] get_user_themes() throws IOError;
public abstract void play_user(string theme, string type) throws IOError;
}
diff --git a/src/audio/audio.vala b/src/audio/audio.vala
index a6e5007..1404969 100644
--- a/src/audio/audio.vala
+++ b/src/audio/audio.vala
@@ -74,6 +74,10 @@ public class AudioPlayerImplementation {
return get_random_file(path + "user/");
}
+ public string[] get_user_themes() {
+ return get_files(path + "user/");
+ }
+
public void play_user(string theme, string type) {
p.set_state(Gst.State.NULL);
var file = get_random_file(path + "user/" + theme+ "/" + type);
diff --git a/src/database/database.vala b/src/database/database.vala
index 74a554d..9596954 100644
--- a/src/database/database.vala
+++ b/src/database/database.vala
@@ -104,9 +104,11 @@ public class DataBase : Object {
queries["session_set"] = "UPDATE authentication SET session=? WHERE user = ?";
queries["session_get"] = "SELECT user FROM authentication WHERE session = ?";
queries["username"] = "SELECT firstname, lastname FROM users WHERE id = ?";
+ queries["user_theme_get"] = "SELECT CASE WHEN sound_theme IS NULL THEN ? ELSE sound_theme END FROM users WHERE id = ?";
+ queries["user_theme_set"] = "UPDATE users SET sound_theme=? WHERE id = ?";
queries["password_get"] = "SELECT password FROM authentication WHERE user = ?";
queries["password_set"] = "UPDATE authentication SET password=? WHERE user = ?";
- queries["userinfo"] = "SELECT firstname, lastname, email, gender, street, plz, city, pgp, hidden, disabled FROM users WHERE id = ?";
+ queries["userinfo"] = "SELECT firstname, lastname, email, gender, street, plz, city, pgp, hidden, disabled, sound_theme FROM users WHERE id = ?";
queries["userauth"] = "SELECT superuser, auth_users, auth_products, auth_cashbox FROM authentication WHERE user = ?";
queries["userauth_set"] = "UPDATE authentication SET auth_users = ?, auth_products = ?, auth_cashbox = ? WHERE user = ?";
queries["profit_by_product"] = "SELECT name, SUM(memberprice - (SELECT price FROM purchaseprices WHERE product = purch.product)) AS price FROM sales purch, prices, products WHERE purch.product = products.id AND purch.product = prices.product AND purch.user > 0 AND purch.timestamp > ? AND purch.timestamp < ? AND prices.valid_from = (SELECT valid_from FROM prices WHERE product = purch.product AND valid_from < purch.timestamp ORDER BY valid_from DESC LIMIT 1) GROUP BY name ORDER BY price;";
@@ -597,16 +599,17 @@ public class DataBase : Object {
if(rc == Sqlite.ROW) {
result.id = user;
- result.firstname = statements["userinfo"].column_text(0);
- result.lastname = statements["userinfo"].column_text(1);
- result.email = statements["userinfo"].column_text(2);
- result.gender = statements["userinfo"].column_text(3);
- result.street = statements["userinfo"].column_text(4);
- result.postcode = statements["userinfo"].column_text(5);
- result.city = statements["userinfo"].column_text(6);
- result.pgp = statements["userinfo"].column_text(7);
- result.hidden = statements["userinfo"].column_int(8) == 1;
- result.disabled = statements["userinfo"].column_int(9) == 1;
+ result.firstname = statements["userinfo"].column_text(0);
+ result.lastname = statements["userinfo"].column_text(1);
+ result.email = statements["userinfo"].column_text(2);
+ result.gender = statements["userinfo"].column_text(3);
+ result.street = statements["userinfo"].column_text(4);
+ result.postcode = statements["userinfo"].column_text(5);
+ result.city = statements["userinfo"].column_text(6);
+ result.pgp = statements["userinfo"].column_text(7);
+ result.hidden = statements["userinfo"].column_int(8) == 1;
+ result.disabled = statements["userinfo"].column_int(9) == 1;
+ result.soundTheme = statements["userinfo"].column_text(10);
} else if(rc == Sqlite.DONE) {
throw new DatabaseError.USER_NOT_FOUND("user not found");
} else {
@@ -675,6 +678,32 @@ public class DataBase : Object {
}
}
+ public string get_user_theme(int user, string fallback) throws DatabaseError {
+ statements["user_theme_get"].reset();
+ statements["user_theme_get"].bind_text(1, fallback);
+ statements["user_theme_get"].bind_int(2, user);
+
+ if(statements["user_theme_get"].step() == Sqlite.ROW) {
+ return statements["user_theme_get"].column_text(0);
+ } else {
+ throw new DatabaseError.USER_NOT_FOUND("No such user available in database!");
+ }
+ }
+
+ public void set_userTheme(int user, string userTheme) throws DatabaseError {
+ statements["user_theme_set"].reset();
+ if (userTheme == "") {
+ statements["user_theme_set"].bind_null(1);
+ } else {
+ statements["user_theme_set"].bind_text(1, userTheme);
+ }
+ statements["user_theme_set"].bind_int(2, user);
+
+ int rc = statements["user_theme_set"].step();
+ if(rc != Sqlite.DONE)
+ throw new DatabaseError.INTERNAL_ERROR("internal error: %d", rc);
+ }
+
public InvoiceEntry[] get_invoice(int user, int64 from=0, int64 to=-1) throws DatabaseError {
InvoiceEntry[] result = {};
diff --git a/src/database/db-interface.vala b/src/database/db-interface.vala
index f5bfada..6142fcf 100644
--- a/src/database/db-interface.vala
+++ b/src/database/db-interface.vala
@@ -32,11 +32,13 @@ public interface Database : Object {
public abstract bool check_user_password(int32 user, string password) throws IOError;
public abstract void set_user_password(int32 user, string password) throws IOError, DatabaseError;
public abstract void set_sessionid(int user, string sessionid) throws IOError, DatabaseError;
+ public abstract void set_userTheme(int user, string userTheme) throws IOError, DatabaseError;
public abstract int get_user_by_sessionid(string sessionid) throws IOError, DatabaseError;
public abstract UserInfo get_user_info(int user) throws IOError, DatabaseError;
public abstract UserAuth get_user_auth(int user) throws IOError, DatabaseError;
public abstract void set_user_auth(UserAuth auth) throws IOError, DatabaseError;
public abstract string get_username(int user) throws IOError, DatabaseError;
+ public abstract string get_user_theme(int user, string fallback) throws IOError, DatabaseError;
public abstract InvoiceEntry[] get_invoice(int user, int64 from=0, int64 to=-1) throws IOError, DatabaseError;
public abstract int64 get_first_purchase(int user) throws IOError;
public abstract int64 get_last_purchase(int user) throws IOError;
@@ -121,6 +123,7 @@ public struct UserInfo {
public string pgp;
public bool disabled;
public bool hidden;
+ public string soundTheme;
public bool equals(UserInfo x) {
if(id != x.id) return false;
diff --git a/src/scanner-session/scannersession.vala b/src/scanner-session/scannersession.vala
index 666f2ac..37b4ad4 100644
--- a/src/scanner-session/scannersession.vala
+++ b/src/scanner-session/scannersession.vala
@@ -67,7 +67,10 @@ public class ScannerSessionImplementation {
this.logged_in = true;
try {
- this.theme = audio.get_random_user_theme();
+ this.theme = db.get_user_theme(user, "");
+ if (this.theme == "") {
+ this.theme = audio.get_random_user_theme();
+ }
} catch(IOError e) {
this.theme = "beep";
}
diff --git a/src/web/Makefile b/src/web/Makefile
index 17140c3..e6094f6 100644
--- a/src/web/Makefile
+++ b/src/web/Makefile
@@ -1,7 +1,7 @@
all: web
@echo > /dev/null
-web: main.vala web.vala websession.vala csv.vala template.vala ../database/db-interface.vala ../pgp/pgp-interface.vala ../price.vapi ../config/config-interface.vala
+web: main.vala web.vala websession.vala csv.vala template.vala ../database/db-interface.vala ../pgp/pgp-interface.vala ../price.vapi ../config/config-interface.vala ../audio/audio-interface.vala
valac -X -w -o $@ --vapidir=../../vapi --enable-experimental --pkg gee-0.8 --pkg gio-2.0 --pkg libsoup-2.4 --pkg posix $^
clean:
diff --git a/src/web/main.vala b/src/web/main.vala
index 86caea5..22c586b 100644
--- a/src/web/main.vala
+++ b/src/web/main.vala
@@ -17,6 +17,7 @@ Database db;
public CSVMemberFile csvimport;
public PGP pgp;
public Config cfg;
+public AudioPlayer audio;
string templatedir;
public static int main(string[] args) {
@@ -26,9 +27,10 @@ public static int main(string[] args) {
uint port = 8080;
try {
- db = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.Database", "/io/mainframe/shopsystem/database");
- pgp = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.PGP", "/io/mainframe/shopsystem/pgp");
- cfg = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.Config", "/io/mainframe/shopsystem/config");
+ db = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.Database", "/io/mainframe/shopsystem/database");
+ pgp = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.PGP", "/io/mainframe/shopsystem/pgp");
+ cfg = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.Config", "/io/mainframe/shopsystem/config");
+ audio = Bus.get_proxy_sync(BusType.SESSION, "io.mainframe.shopsystem.AudioPlayer", "/io/mainframe/shopsystem/audio");
templatedir = cfg.get_string("WEB", "filepath");
port = cfg.get_integer("WEB", "port");
diff --git a/src/web/web.vala b/src/web/web.vala
index fb03e4b..c63db73 100644
--- a/src/web/web.vala
+++ b/src/web/web.vala
@@ -359,19 +359,36 @@ public class WebServer {
t.replace("ISADMIN2", "disabled=\"disabled\"");
}
+ var userThemeList = audio.get_user_themes();
+ var message = "";
var postdata = Soup.Form.decode_multipart(msg, null, null, null, null);
if(postdata != null && postdata.contains("password1") && postdata.contains("password2")) {
if(postdata["password1"] != postdata["password2"]) {
- t.replace("MESSAGE", "<div class=\"alert alert-error\">Error! Passwords do not match!</div>");
+ message = "<div class=\"alert alert-error\">Error! Passwords do not match!</div>";
} else if(postdata["password1"] == "") {
- t.replace("MESSAGE", "<div class=\"alert alert-error\">Error! Empty Password not allowed!</div>");
+ message = "<div class=\"alert alert-error\">Error! Empty Password not allowed!</div>";
} else {
db.set_user_password(id, postdata["password1"]);
- t.replace("MESSAGE", "<div class=\"alert alert-success\">Password Changed!</div>");
+ message = "<div class=\"alert alert-success\">Password Changed!</div>";
}
- } else {
- t.replace("MESSAGE", "");
+ } else if(postdata != null && postdata.contains("soundTheme")) {
+ if (postdata["soundTheme"] in userThemeList) {
+ userinfo.soundTheme = postdata["soundTheme"];
+ db.set_userTheme(id, postdata["soundTheme"]);
+ } else {
+ userinfo.soundTheme = null;
+ db.set_userTheme(id, "");
+ }
+ message = "<div class=\"alert alert-success\">Sound theme changed.</div>";
+ }
+ t.replace("MESSAGE", message);
+
+ var soundThemes = "";
+ foreach(var theme in userThemeList) {
+ var selected = userinfo.soundTheme == theme ? "selected" : "";
+ soundThemes += @"<option $selected>$theme</option>";
}
+ t.replace("SOUND_THEMES", soundThemes);
msg.set_response("text/html", Soup.MemoryUse.COPY, t.data);
msg.set_status(200);