diff --git a/resources/templates/base.html b/resources/templates/base.html index d444604..944de40 100644 --- a/resources/templates/base.html +++ b/resources/templates/base.html @@ -5,7 +5,9 @@ + + @@ -15,7 +17,6 @@

plauna

Admin Statistics Emails - Training Data Watchers
diff --git a/resources/templates/emails.html b/resources/templates/emails.html index 12365e7..34109b7 100644 --- a/resources/templates/emails.html +++ b/resources/templates/emails.html @@ -4,23 +4,135 @@

{{header}}

-
-

Total e-mail count: {{page.total}}

-
+ +
+

+ +

+ + +

+ +

+ +
+ + +
+ + Showing page {{page.page}} of {{page.total-pages}} + +
+ {% if page.page > 1 %} - Prev + + + Prev + {% else %} - Prev + + + Prev + {% endif %} - {{page.page}} {% if page.page <= page.last-page %} - Next + + Next + + {% else %} - Next + + Next + + {% endif %}
+ + +
+ + + +
+
+ +
+
+ {% for email in emails %} + + + + {% endfor %} + @@ -28,7 +140,9 @@

{{header}}

+ + @@ -38,10 +152,18 @@

{{header}}

- - + + + + {% endfor %} +
Date From To LanguageLang. Confidence CategoryCat. Confidence
{{email.header.subject}} {{email.participants|concat-senders}} {{email.participants|concat-receivers}}{{email.metadata.language}}{{email.metadata.category}}{{email.metadata.language-confidence|double-format-nillable:10}}{{email.metadata.category-confidence|double-format-nillable:10}}
+
diff --git a/src/plauna/markup.clj b/src/plauna/markup.clj index 1c770e8..4a29613 100644 --- a/src/plauna/markup.clj +++ b/src/plauna/markup.clj @@ -48,10 +48,18 @@ (add-filter! :concat-bcc (partial concat-contacts :bcc)) -(defn list-emails [emails page-info] +(add-filter! :double-format-nillable (fn [n & [decimal-places]] + (if (nil? n) + 0 + (let [n (double n)] + (format (str "%." (if decimal-places decimal-places "1") "f") + n))) + )) + +(defn list-emails [emails page-info categories] (let [last-page {:last-page (quot (:total page-info) (:size page-info))} emails-with-java-date (map #(update-in % [:header :date] timestamp->date) emails)] - (render-file "emails.html" {:emails emails-with-java-date :page (conj page-info last-page) :header "Emails"}))) + (render-file "emails.html" {:emails emails-with-java-date :page (conj page-info last-page) :header "Emails" :categories categories}))) (defn list-email-contents [email-data categories] (render-file "email.html" {:email (update-in email-data [:header :date] timestamp->date) :categories categories})) diff --git a/src/plauna/server.clj b/src/plauna/server.clj index 5515030..c2eafa8 100644 --- a/src/plauna/server.clj +++ b/src/plauna/server.clj @@ -28,12 +28,6 @@ (def html-headers {"Content-Type" "text/html; charset=UTF-8"}) -(defn get-param-or [request param or] - (let [param-in-request (param request)] - (if (nil? param-in-request) - or - (Integer/parseInt param-in-request)))) - (defn interleave-all [& seqs] (reduce (fn [acc index] (into acc (map #(get % index) seqs))) [] @@ -179,11 +173,24 @@ :group-by [:interval] :where where-clause}))) -(defn paginated-strictly-enriched-emails [page] - (db/fetch-data {:entity :enriched-email :strict true :page page} {:where [:and [:<> :category nil] [:<> :language nil]] :order-by [[:category-modified :desc]]})) - (defn enriched-email-by-message-id [id] (first (db/fetch-data {:entity :enriched-email :strict false} {:where [:= :message-id id]}))) +;; TODO change name template +(def emails-template {:page-size {:default 20 :type-fn Integer/parseInt} + :page {:default 1 :type-fn Integer/parseInt} + :filter {:default "all" :type-fn (fn [x] x)}}) + +(defn template->request-parameters [template] + (fn [rp] (reduce (fn [acc [k v]] (if (contains? rp k) + (conj acc {k ((:type-fn v) (get rp k))}) + (conj acc {k (:default v)}))) + {} template))) + +(defn filter->sql-clause [filter] + (cond + (= filter "enriched-only") {:where [:and [:<> :metadata.category nil] [:<> :metadata.language nil]] :order-by [[:date :desc]]} + (= filter "without-category") {:where [:= :metadata.category nil] :order-by [[:date :desc]]} + :else {:order-by [[:date :desc]]})) (comp/defroutes routes @@ -298,17 +305,7 @@ {:years years :selected-interval selected-interval :selected-year (get params :year)})))) - (comp/GET "/training" {request-params :params} - (let [page (get-param-or request-params :page 1) - page-size (get-param-or request-params :page-size 10) - categories (db/get-categories) - result (paginated-strictly-enriched-emails {:size page-size :page page}) - languages (db/get-languages) - size (:size result) - page (:page result) - total (:total result)] - (success-html-with-body (markup/email-training-page (:data result) categories languages {:size size :page page :total total})))) - + (comp/POST "/metadata" request (save-metadata-form (:params request)) (redirect-request request)) @@ -317,37 +314,20 @@ (write-emails-to-training-files-and-train) (redirect-request request)) - (comp/GET "/training/new" {params :params} - (let [page (get-param-or params :page 1) - page-size (get-param-or params :page-size 20) - language (get params :language) - sql-clause (if (nil? language) - {:where [:and [:<> :language nil] [:= :category nil]]} - {:where [:and [:= :language language] [:= :category nil]]}) - untrained-emails (db/fetch-data {:entity :enriched-email :page (page/page-request page page-size) :strict false} sql-clause) + (comp/POST "/training/new" request + (let [n (get (:route-params request) :new 20)] + (categorize-uncategorized-n-emails n) + (redirect-request request))) + + (comp/GET "/emails" {params :params} + (let [parse-fn (template->request-parameters emails-template) + {page-size :page-size page :page filter :filter} (parse-fn params) categories (conj (db/get-categories) {:id -1 :name "n/a"}) - page-info {:size (:size untrained-emails) :page (:page untrained-emails) :total (:total untrained-emails)} - languages (db/get-languages)] + sql-clause (filter->sql-clause filter) + result (db/fetch-data {:entity :enriched-email :strict false :page (page/page-request page page-size)} sql-clause)] {:status 200 :header html-headers - :body (markup/email-new-training-page untrained-emails categories languages page-info)})) - - (comp/POST "/training/new" {route-params :route-params} - (let [n (get route-params :new 20)] - (write-emails-to-training-files-and-train) - (categorize-uncategorized-n-emails n) - {:status 301 - :header {"Location" "/training"}})) - - (comp/GET "/emails" [page page-size] - (if (or (nil? page) (nil? page-size)) - (redirect "/emails?page=1&page-size=20") - (let [parsed-page (as-int page) - parsed-page-size (as-int page-size) - result (db/fetch-data {:entity :enriched-email :strict false :page (page/page-request parsed-page parsed-page-size)} {:order-by [[:date :desc]]})] - {:status 200 - :header html-headers - :body (markup/list-emails (:data result) {:size parsed-page-size :page (:page result) :total (:total result)})}))) + :body (markup/list-emails (:data result) {:filter filter :total-pages (inc (int (clojure.math/ceil (quot (:total result) page-size)))) :size page-size :page (:page result) :total (:total result)} categories)})) (comp/GET "/emails/:id" [id] (let [decoded-id (url-decode id)