You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by di...@apache.org on 2021/12/14 19:20:19 UTC

[allura] 01/03: 8403 added new project_url field with validator and tooltips

This is an automated email from the ASF dual-hosted git repository.

dill0wn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git

commit 80bffed6d44d7fbefeb4f9ca17eda71d0097eae8
Author: Guillermo Cruz <gu...@slashdotmedia.com>
AuthorDate: Tue Dec 7 18:47:52 2021 -0700

    8403 added new project_url field with validator and tooltips
---
 ForgeImporters/forgeimporters/github/__init__.py   | 13 +++-
 ForgeImporters/forgeimporters/github/project.py    |  2 +
 .../forgeimporters/github/templates/project.html   | 70 +++++++++++++++++++++-
 .../forgeimporters/templates/project_base.html     |  1 +
 4 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/ForgeImporters/forgeimporters/github/__init__.py b/ForgeImporters/forgeimporters/github/__init__.py
index 32098fa..ebbbef9 100644
--- a/ForgeImporters/forgeimporters/github/__init__.py
+++ b/ForgeImporters/forgeimporters/github/__init__.py
@@ -21,6 +21,7 @@ import re
 import logging
 import json
 import time
+import requests
 import six.moves.urllib.parse
 import six.moves.urllib.request
 import six.moves.urllib.error
@@ -30,14 +31,24 @@ from tg import config, session, redirect, request, expose
 from tg.decorators import without_trailing_slash
 from tg import tmpl_context as c
 from requests_oauthlib import OAuth2Session
-import requests
 from formencode import validators as fev
 
 from forgeimporters import base
+from urllib.parse import urlparse
 
 log = logging.getLogger(__name__)
 
 
+class GitHubURLValidator(fev.FancyValidator):
+    regex = r'https?:\/\/github\.com'
+    def _to_python(self, value, state):
+        valid_url = urlparse(value.strip())
+        if not bool(valid_url.scheme):
+            raise fev.Invalid('Invalid URL', value, state)
+        if not re.match(self.regex, value):
+            raise fev.Invalid('Invalid Github URL', value, state)
+        return value
+
 class GitHubProjectNameValidator(fev.FancyValidator):
     not_empty = True
     messages = {
diff --git a/ForgeImporters/forgeimporters/github/project.py b/ForgeImporters/forgeimporters/github/project.py
index 914ccf8..8d16838 100644
--- a/ForgeImporters/forgeimporters/github/project.py
+++ b/ForgeImporters/forgeimporters/github/project.py
@@ -29,6 +29,7 @@ from forgeimporters.github import (
     tasks,
     GitHubOAuthMixin,
     GitHubProjectNameValidator,
+    GitHubURLValidator,
 )
 
 
@@ -37,6 +38,7 @@ log = logging.getLogger(__name__)
 
 class GitHubProjectForm(base.ProjectImportForm):
     project_name = GitHubProjectNameValidator()
+    project_url = GitHubURLValidator()
 
 
 class GitHubProjectImporter(base.ProjectImporter, GitHubOAuthMixin):
diff --git a/ForgeImporters/forgeimporters/github/templates/project.html b/ForgeImporters/forgeimporters/github/templates/project.html
index 6f4a067..2c2a6d5 100644
--- a/ForgeImporters/forgeimporters/github/templates/project.html
+++ b/ForgeImporters/forgeimporters/github/templates/project.html
@@ -16,11 +16,29 @@
        specific language governing permissions and limitations
        under the License.
 -#}
+{%- import '/var/local/sftheme/allura/sftheme/templates/sftheme/shared_svgs_macro.html' as shared_svgs_macro -%}
 {% extends 'forgeimporters:templates/project_base.html' %}
 
+
 {% block project_fields %}
-    <div class="grid-6">
-        <label>GitHub User Name</label>
+
+     <div class="grid-6" style="clear:left">
+        <label>GitHub Project URL
+            <span class="tooltip" title="Paste a Github project url to automatically set the user name and project name">{{ shared_svgs_macro.global_svgs('info-circle', class='svgico info-circle') }}</span>
+        </label>
+    </div>
+     <div class="grid-10">
+        <input id="project_url" name="project_url" value="{{c.form_values['project_url']}}" />
+        <div id="project_url_error" class="error{% if not c.form_errors['project_url'] %} hidden{% endif %}">
+            {{c.form_errors['project_url']}}
+        </div>
+    </div>
+
+    <div class="grid-6" style="clear:left">
+        <label>
+            GitHub User Name
+            <span class="tooltip" title="Your Github user name can be found in the dropdown menu when you click on your avatar">{{ shared_svgs_macro.global_svgs('info-circle', class='svgico info-circle') }}</span>
+        </label>
     </div>
      <div class="grid-10">
         <input id="user_name" name="user_name" value="{{c.form_values['user_name']}}" autofocus/>
@@ -29,8 +47,15 @@
         </div>
     </div>
 
+
+
+
     <div class="grid-6" style="clear:left">
-        <label>GitHub Project Name</label>
+        <label>
+            GitHub Project Name
+            <span class="tooltip" title="You can select any name from your repositories section">{{ shared_svgs_macro.global_svgs('info-circle', class='svgico info-circle') }}</span>
+        </label>
+
     </div>
      <div class="grid-10">
         <input id="project_name" name="project_name" value="{{c.form_values['project_name']}}" />
@@ -51,4 +76,43 @@
             http://{{request.environ['HTTP_HOST']}}{{importer.neighborhood.url()}}<span id="url-fragment">{{c.form_values['project_shortname']}}</span>
         </div>
     </div>
+    <script>
+    $(window).load(function() {
+
+        function name(str) {
+            return str ? str.replace(/^\W+|\.git$/g, '') : null;
+        }
+
+        function owner(str) {
+            if (!str) return null;
+            var idx = str.indexOf(':');
+            if (idx > -1) {
+                return str.slice(idx + 1);
+            }
+            return str;
+        }
+
+        $('#project_url').on('keyup', function (evt) {
+            $('#project_url_error').toggleClass('hidden', true);
+            if (!$(this).val()) {
+                $('#project_name').val('');
+                $('#user_name').val('');
+                return;
+            }
+            try {
+                var url = new window.URL($(this).val());
+            }catch(e){
+                $('#project_url_error').empty().append('<p>Not a valid URL</p>');
+                $('#project_url_error').toggleClass('hidden', false);
+                return
+            }
+            var pieces = url.pathname.split('/').filter(Boolean);
+            var _owner = owner(pieces[0]);
+            var _name = name(pieces[1]);
+            $('#project_name').val(_name);
+            $('#user_name').val(_owner);
+            $('#project_name').trigger('change');
+        })
+    })
+    </script>
 {% endblock %}
diff --git a/ForgeImporters/forgeimporters/templates/project_base.html b/ForgeImporters/forgeimporters/templates/project_base.html
index 65b33b8..0eea95d 100644
--- a/ForgeImporters/forgeimporters/templates/project_base.html
+++ b/ForgeImporters/forgeimporters/templates/project_base.html
@@ -67,6 +67,7 @@
         $(function() {
             $('#project_name').bind('change keyup', suggest_name);
             $('#project_shortname').bind('change keyup', function(event) {
+                console.log("EVEN FIRED!!!")
                 if (event.type == 'keyup') {
                     manual = true;
                 }