Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: getnikola/nikola-users
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 5915c04fe03c
Choose a base ref
...
head repository: getnikola/nikola-users
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8ae176338971
Choose a head ref
  • 2 commits
  • 73 files changed
  • 1 contributor

Commits on Oct 16, 2015

  1. Update introductory text

    Signed-off-by: Chris Warrick <kwpolska@gmail.com>
    Kwpolska committed Oct 16, 2015
    Copy the full SHA
    6667ab6 View commit details

Commits on Oct 17, 2015

  1. Handle site checking with AJAX

    (Thanks to security limitations, we can’t download the sites client-side.)
    
    Signed-off-by: Chris Warrick <kwpolska@gmail.com>
    Kwpolska committed Oct 17, 2015
    Copy the full SHA
    8ae1763 View commit details
Showing with 106 additions and 14,927 deletions.
  1. +3 −0 nikolausers/settings.py
  2. +16 −48 sites/checker.py
  3. +1 −0 sites/urls.py
  4. +11 −12 sites/views.py
  5. +0 −850 static/admin/css/base.css
  6. +0 −293 static/admin/css/changelists.css
  7. +0 −30 static/admin/css/dashboard.css
  8. +0 −396 static/admin/css/forms.css
  9. +0 −63 static/admin/css/ie.css
  10. +0 −60 static/admin/css/login.css
  11. +0 −250 static/admin/css/rtl.css
  12. +0 −592 static/admin/css/widgets.css
  13. BIN static/admin/img/changelist-bg.gif
  14. BIN static/admin/img/changelist-bg_rtl.gif
  15. BIN static/admin/img/default-bg-reverse.gif
  16. BIN static/admin/img/default-bg.gif
  17. BIN static/admin/img/deleted-overlay.gif
  18. BIN static/admin/img/gis/move_vertex_off.png
  19. BIN static/admin/img/gis/move_vertex_on.png
  20. BIN static/admin/img/icon-no.gif
  21. BIN static/admin/img/icon-unknown.gif
  22. BIN static/admin/img/icon-yes.gif
  23. BIN static/admin/img/icon_addlink.gif
  24. BIN static/admin/img/icon_alert.gif
  25. BIN static/admin/img/icon_calendar.gif
  26. BIN static/admin/img/icon_changelink.gif
  27. BIN static/admin/img/icon_clock.gif
  28. BIN static/admin/img/icon_deletelink.gif
  29. BIN static/admin/img/icon_error.gif
  30. BIN static/admin/img/icon_searchbox.png
  31. BIN static/admin/img/icon_success.gif
  32. BIN static/admin/img/inline-delete-8bit.png
  33. BIN static/admin/img/inline-delete.png
  34. BIN static/admin/img/inline-restore-8bit.png
  35. BIN static/admin/img/inline-restore.png
  36. BIN static/admin/img/inline-splitter-bg.gif
  37. BIN static/admin/img/nav-bg-grabber.gif
  38. BIN static/admin/img/nav-bg-reverse.gif
  39. BIN static/admin/img/nav-bg-selected.gif
  40. BIN static/admin/img/nav-bg.gif
  41. BIN static/admin/img/selector-icons.gif
  42. BIN static/admin/img/selector-search.gif
  43. BIN static/admin/img/sorting-icons.gif
  44. BIN static/admin/img/tooltag-add.png
  45. BIN static/admin/img/tooltag-arrowright.png
  46. +0 −20 static/admin/js/LICENSE-JQUERY.txt
  47. +0 −114 static/admin/js/SelectBox.js
  48. +0 −166 static/admin/js/SelectFilter2.js
  49. +0 −144 static/admin/js/actions.js
  50. +0 −6 static/admin/js/actions.min.js
  51. +0 −357 static/admin/js/admin/DateTimeShortcuts.js
  52. +0 −130 static/admin/js/admin/RelatedObjectLookups.js
  53. +0 −169 static/admin/js/calendar.js
  54. +0 −24 static/admin/js/collapse.js
  55. +0 −2 static/admin/js/collapse.min.js
  56. +0 −246 static/admin/js/core.js
  57. +0 −272 static/admin/js/inlines.js
  58. +0 −9 static/admin/js/inlines.min.js
  59. +0 −7 static/admin/js/jquery.init.js
  60. +0 −10,346 static/admin/js/jquery.js
  61. +0 −4 static/admin/js/jquery.min.js
  62. +0 −39 static/admin/js/prepopulate.js
  63. +0 −1 static/admin/js/prepopulate.min.js
  64. +0 −23 static/admin/js/related-widget-wrapper.js
  65. +0 −94 static/admin/js/timeparse.js
  66. +0 −147 static/admin/js/urlify.js
  67. +61 −0 static/check.js
  68. +1 −0 static/check.min.js
  69. 0 static/{assets/css → }/users.css
  70. 0 static/{assets/css → }/users.min.css
  71. +4 −2 templates/base.html
  72. +8 −10 templates/check.html
  73. +1 −1 templates/index.html
3 changes: 3 additions & 0 deletions nikolausers/settings.py
Original file line number Diff line number Diff line change
@@ -111,7 +111,10 @@
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_URL = '/static/'
STATIC_ROOT = '/srv/users.getnikola.com/static'


LOGGING = {
'version': 1,
64 changes: 16 additions & 48 deletions sites/checker.py
Original file line number Diff line number Diff line change
@@ -1,51 +1,19 @@
import requests
from django.utils.html import format_html, mark_safe

CHECK_SUCCESS = mark_safe("""
<p class="text-success">
<i class="fa fa-check" style="font-size: 2em;"></i>
This is a Nikola site.</p>""")
def gencheck(url):
if not url.endswith('/rss.xml'):
return {"type": "error", "data": "This is not a random web proxy."}
r = requests.get(url)
patterns = [b'<generator>https://getnikola.com/</generator>', # v7.6.1
b'<generator>http://getnikola.com/</generator>', # v7.0.0
b'<generator>Nikola <http://getnikola.com/></generator>', # v6.3.0
b'<generator>nikola</generator>'] # v6.2.1
result = -1
for i, p in enumerate(patterns):
if p in r.content:
result = i

CHECK_FAILURE = mark_safe("""
<p class="text-danger">
<i class="fa fa-times" style="font-size: 2em;"></i>
This is not a Nikola site.</p>""")

CHECK_UNKNOWN = """
<p class="text-warning">
<i class="fa fa-warning" style="font-size: 2em;"></i>
The check has failed. {0}</p>"""

CHECK_ERROR_NODATA = [mark_safe("""
<p class="text-warning">
<i class="fa fa-warning" style="font-size: 2em;"></i>
No URL provided or the form is invalid.</p>""")]


def gencheck(homeurl):
yield format_html('<p>Checking site: <strong>{0}</strong>.</p>', homeurl)
burl = homeurl.split('index.html')[0]
if not burl.endswith('/'):
burl += '/'
if homeurl != burl:
yield format_html('<p>Base determined as <strong>{0}</strong>.</p>', burl)
rssurl = burl + 'rss.xml'
try:
r = requests.get(rssurl)
nsite = False
patterns = [b'<generator>https://getnikola.com/</generator>', # v7.6.1
b'<generator>http://getnikola.com/</generator>', # v7.0.0
b'<generator>Nikola <http://getnikola.com/></generator>', # v6.3.0
b'<generator>nikola</generator>'] # v6.2.1
for i in patterns:
if i in r.content:
nsite = True

if nsite:
yield CHECK_SUCCESS
elif r.status_code not in [200, 404]:
yield format_html(CHECK_UNKNOWN, 'HTTP Error {0}.'.format(r.status_code))
else:
yield CHECK_FAILURE
except NameError as e:
yield format_html(CHECK_UNKNOWN, 'An unhandled exception occurred: ' + str(e))
if r.status_code != 200:
return {"type": "error", "data": 'HTTP Error {0}.'.format(r.status_code)}
else:
return {"type": "result", "data": result}
1 change: 1 addition & 0 deletions sites/urls.py
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
url(r'^edit/?$', views.edit, name='edit'),
url(r'^remove/?$', views.remove, name='remove'),
url(r'^check/?$', views.check, name='check'),
url(r'^api/check$', views.api_check, name='api_check'),
url(r'^tos/?$', views.tos, name='tos'),
url(r'^lang/?$', views.langlist, name='langlist'),
url(r'^lang/(?P<language_code>[a-z]{2,5})/?$', views.lang, name='lang'),
23 changes: 11 additions & 12 deletions sites/views.py
Original file line number Diff line number Diff line change
@@ -2,10 +2,10 @@
from django.shortcuts import render
from django.core.mail import send_mail
from django.utils.html import format_html
from django.http import HttpResponseNotFound
from django.http import JsonResponse, HttpResponseNotFound
from .models import Site, Language
from .checker import gencheck, CHECK_ERROR_NODATA
from .forms import AddForm, CheckForm
from .checker import gencheck
from .forms import AddForm

MENU = (
('/', 'Users Home', 'home'),
@@ -162,20 +162,19 @@ def check(request):
'menu': MENU,
'title': 'Check a Site',
'page': 'check',
'data': [],
}

if request.method == 'POST':
form = CheckForm(request.POST)
if form.is_valid():
context['data'] = gencheck(form.cleaned_data['url'])
context['url'] = form.cleaned_data['url']
else:
context['data'] = CHECK_ERROR_NODATA

return render(request, 'check.html', context)


def api_check(request):
"""Check API."""
if 'url' in request.GET:
return JsonResponse(gencheck(request.GET['url']))
else:
return JsonResponse({"type": "error", "data": "No URL specified. Please remember this is not a random web proxy."})


def tos(request):
"""Terms of Service view."""
context = {
Loading