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;
}