[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
07/07: Add the packages-translation-availability page
From: |
Christopher Baines |
Subject: |
07/07: Add the packages-translation-availability page |
Date: |
Fri, 26 Jun 2020 12:55:13 -0400 (EDT) |
cbaines pushed a commit to branch master
in repository data-service.
commit f60c2eabcea8835a4a3db846f1400e413ee3267a
Author: Danjela Lura <danielaluraa@gmail.com>
AuthorDate: Fri Jun 26 17:05:26 2020 +0200
Add the packages-translation-availability page
Signed-off-by: Christopher Baines <mail@cbaines.net>
---
guix-data-service/model/package-metadata.scm | 61 +++++++++++++-
guix-data-service/web/revision/controller.scm | 44 +++++++++++
guix-data-service/web/revision/html.scm | 109 ++++++++++++++++++++++++++
3 files changed, 213 insertions(+), 1 deletion(-)
diff --git a/guix-data-service/model/package-metadata.scm
b/guix-data-service/model/package-metadata.scm
index 032e706..c906fa4 100644
--- a/guix-data-service/model/package-metadata.scm
+++ b/guix-data-service/model/package-metadata.scm
@@ -34,7 +34,10 @@
inferior-packages->package-metadata-ids
inferior-packages->translated-package-descriptions-and-synopsis
- package-description-and-synopsis-locale-options-guix-revision))
+ package-description-and-synopsis-locale-options-guix-revision
+
+ synopsis-counts-by-locale
+ description-counts-by-locale))
(define locales
'("cs_CZ.utf8"
@@ -434,3 +437,59 @@ WHERE packages.id IN (
ON package_derivations.id =
guix_revision_package_derivations.package_derivation_id
WHERE guix_revision_package_derivations.revision_id = $1"
(list revision-id)))
+
+(define (synopsis-counts-by-locale conn revision-id)
+ (define synopsis-counts
+ "
+SELECT package_synopsis.locale, COUNT(package_synopsis.synopsis) AS
translated_synopsis
+FROM package_synopsis_sets
+INNER JOIN package_synopsis
+ ON package_synopsis.id = ANY (package_synopsis_sets.synopsis_ids)
+WHERE package_synopsis_sets.id IN (
+ SELECT package_metadata.package_synopsis_set_id
+ FROM packages
+ INNER JOIN package_derivations
+ ON packages.id = package_derivations.package_id
+ INNER JOIN guix_revision_package_derivations
+ ON package_derivations.id =
guix_revision_package_derivations.package_derivation_id
+ INNER JOIN guix_revisions
+ ON guix_revision_package_derivations.revision_id = guix_revisions.id
+ INNER JOIN package_metadata
+ ON package_metadata.id = packages.package_metadata_id
+ WHERE guix_revisions.id = $1)
+GROUP BY package_synopsis.locale;
+")
+ (map
+ (match-lambda
+ ((locale synopsis-counts)
+ `(,locale . ,(string->number synopsis-counts))))
+ (exec-query conn synopsis-counts
+ (list revision-id))))
+
+(define (description-counts-by-locale conn revision-id)
+ (define description-counts
+ "
+SELECT package_descriptions.locale, COUNT(package_descriptions.description)
AS translated_description
+FROM package_description_sets
+INNER JOIN package_descriptions
+ ON package_descriptions.id = ANY (package_description_sets.description_ids)
+ WHERE package_description_sets.id IN (
+ SELECT package_metadata.package_description_set_id
+ FROM packages
+ INNER JOIN package_derivations
+ ON packages.id = package_derivations.package_id
+ INNER JOIN guix_revision_package_derivations
+ ON package_derivations.id =
guix_revision_package_derivations.package_derivation_id
+ INNER JOIN guix_revisions
+ ON guix_revision_package_derivations.revision_id = guix_revisions.id
+ INNER JOIN package_metadata
+ ON package_metadata.id = packages.package_metadata_id
+ WHERE guix_revisions.id = $1)
+GROUP BY package_descriptions.locale;
+")
+ (map
+ (match-lambda
+ ((locale description-counts)
+ `(,locale . ,(string->number description-counts))))
+ (exec-query conn description-counts
+ (list revision-id))))
diff --git a/guix-data-service/web/revision/controller.scm
b/guix-data-service/web/revision/controller.scm
index 5b6d1bf..5ef3451 100644
--- a/guix-data-service/web/revision/controller.scm
+++ b/guix-data-service/web/revision/controller.scm
@@ -147,6 +147,15 @@
(render-unknown-revision mime-types
conn
commit-hash)))
+ (('GET "revision" commit-hash "packages-translation-availability")
+ (if (guix-commit-exists? conn commit-hash)
+ (render-revision-packages-translation-availability mime-types
+ conn
+ commit-hash
+ #:path-base path)
+ (render-unknown-revision mime-types
+ conn
+ commit-hash)))
(('GET "revision" commit-hash "package" name)
(if (guix-commit-exists? conn commit-hash)
(render-revision-package mime-types
@@ -648,6 +657,41 @@
#:header-link header-link)
#:extra-headers http-headers-for-unchanging-content))))))
+(define* (render-revision-packages-translation-availability mime-types
+ conn
+ commit-hash
+ #:key
+ path-base
+ (header-link
+ (string-append
+ "/revision/"
commit-hash))
+ (header-text
+ `("Revision "
(samp ,commit-hash))))
+ (let ((package-synopsis-counts
+ (synopsis-counts-by-locale conn
+ (commit->revision-id conn
+ commit-hash)))
+ (package-description-counts
+ (description-counts-by-locale conn
+ (commit->revision-id conn
+ commit-hash))))
+ (case (most-appropriate-mime-type
+ '(application/json text/html)
+ mime-types)
+ ((application/json)
+ (render-json
+ `((package-synopsis-counts . ,package-synopsis-counts)
+ (package-description-counts . ,package-description-counts))))
+ (else
+ (render-html
+ #:sxml
+ (view-revision-packages-translation-availability commit-hash
+
package-synopsis-counts
+
package-description-counts
+ #:path-base path-base
+ #:header-link
header-link
+ #:header-text
header-text))))))
+
(define* (render-revision-package mime-types
conn
commit-hash
diff --git a/guix-data-service/web/revision/html.scm
b/guix-data-service/web/revision/html.scm
index c49624d..60c6466 100644
--- a/guix-data-service/web/revision/html.scm
+++ b/guix-data-service/web/revision/html.scm
@@ -34,6 +34,7 @@
view-revision-package-and-version
view-revision
view-revision-packages
+ view-revision-packages-translation-availability
view-revision-package-derivations
view-revision-package-derivation-outputs
view-revision-system-tests
@@ -717,6 +718,114 @@
"Next page")))
'())))))
+(define* (view-revision-packages-translation-availability commit-hash
+
package-synopsis-counts
+
package-description-counts
+ #:key
+ path-base header-link
+ header-text)
+ (define total-package-synopsis
+ (assoc-ref package-synopsis-counts "en_US.utf8"))
+
+ (define total-package-descriptions
+ (assoc-ref package-description-counts "en_US.utf8"))
+
+ (assoc-remove! package-synopsis-counts "en_US.utf8")
+ (assoc-remove! package-description-counts "en_US.utf8")
+
+ (define synopsis-percentages
+ (map
+ (match-lambda
+ ((locale . count)
+ (exact->inexact
+ (* 100 (/ (or count
+ 0)
+ total-package-synopsis)))))
+ package-synopsis-counts))
+
+ (define description-percentages
+ (map
+ (match-lambda
+ ((locale . count)
+ (exact->inexact
+ (* 100 (/ (or count
+ 0)
+ total-package-descriptions)))))
+ package-description-counts))
+
+ (layout
+ #:body
+ `(,(header)
+ (div
+ (@ (class "container"))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (h3 (a (@ (style "white-space: nowrap;")
+ (href ,header-link))
+ ,@header-text)))
+ (div
+ (@ (class "col-sm-12"))
+ (a (@ (class "btn btn-default btn-lg pull-right")
+ (href ,(string-append path-base ".json")))
+ "View JSON")))
+ (div (@ (class "row"))
+ (div (@ (class "col-sm-6"))
+ (table (@ (class "table"))
+ (thead
+ (tr
+ (th (@ (scope "col")) "Locale")
+ (th (@ (scope "col")) "Translated Package Synopsis")))
+ (tbody
+ ,@(map
+ (lambda (synopsis-locale synopsis-percentage)
+ `(tr
+ (th (@ (scope "row")) ,synopsis-locale)
+ (td
+ ,(simple-format #f "~~~A%" (inexact->exact
+ (round
synopsis-percentage)))
+ (div (@ (class "progress"))
+ (div (@ (class "progress-bar")
+ (role "progressbar")
+ (aria-valuenow ,synopsis-percentage)
+ (aria-valuemin "0")
+ (aria-valuemax "100")
+ (style ,(string-append
+ "width: "
+ (number->string
+ synopsis-percentage)
+ "%;"))))))))
+ (map car package-synopsis-counts)
+ synopsis-percentages))))
+ (div (@ (class "col-sm-6"))
+ (table (@ (class "table"))
+ (thead
+ (tr
+ (th (@ (scope "col")) "Locale")
+ (th (@ (scope "col")) "Translated Package Descriptions")))
+ (tbody
+ ,@(map
+ (lambda (description-locale description-percentage)
+ `(tr
+ (th (@ (scope "row")) ,description-locale)
+ (td
+ ,(simple-format #f "~~~A%" (inexact->exact
+ (round
description-percentage)))
+ (div (@ (class "progress"))
+ (div (@ (class "progress-bar")
+ (role "progressbar")
+ (aria-valuenow
,description-percentage)
+ (aria-valuemin "0")
+ (aria-valuemax "100")
+ (style ,(string-append
+ "width: "
+ (number->string
+ description-percentage)
+ "%;"))))))))
+ (map car package-description-counts)
+ description-percentages)))))))))
+
(define* (view-revision-system-tests commit-hash
system-tests
git-repositories
- branch master updated (0b48254 -> f60c2ea), Christopher Baines, 2020/06/26
- 01/07: Include locale in the JSON response for the packages page, Christopher Baines, 2020/06/26
- 02/07: Embed the locale option in the URI of the package page, Christopher Baines, 2020/06/26
- 04/07: Include locale in search-packages-in-revision, Christopher Baines, 2020/06/26
- 05/07: Add locale values in the JSON response for the lint warnings page, Christopher Baines, 2020/06/26
- 06/07: Add indications for no translations available in the lint warnings page, Christopher Baines, 2020/06/26
- 03/07: Add indications for no translations available in the packages page, Christopher Baines, 2020/06/26
- 07/07: Add the packages-translation-availability page,
Christopher Baines <=