mirror of
https://github.com/correl/codereview.git
synced 2024-11-23 19:19:50 +00:00
Merge branch 'auth'
This commit is contained in:
commit
5864556b9e
11 changed files with 113 additions and 14 deletions
|
@ -1,6 +1,8 @@
|
|||
import os
|
||||
from django.http import Http404
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from codereview.dashboard.models import Repository
|
||||
from codereview.browser import vcs
|
||||
|
||||
|
@ -37,12 +39,16 @@ def _log_data(request, repo, ref, path=None):
|
|||
'newer': newer,
|
||||
'older': older,
|
||||
}
|
||||
@permission_required('dashboard.browse')
|
||||
def log(request, repository, path=None):
|
||||
repo, ref = _repo(request, repository)
|
||||
data = {'repository': repository}
|
||||
data = RequestContext(request, {
|
||||
'repository': repository
|
||||
})
|
||||
data.update(_log_data(request, repo, ref, path))
|
||||
data.update(_nav_data(request, repo, ref, path))
|
||||
return render_to_response('browser/log.html', data)
|
||||
@permission_required('dashboard.browse')
|
||||
def commit(request, repository, ref):
|
||||
try:
|
||||
repository = Repository.objects.get(name=repository)
|
||||
|
@ -52,20 +58,21 @@ def commit(request, repository, ref):
|
|||
commit = repo.commit(ref)
|
||||
diffs = repo.diff(ref)
|
||||
|
||||
return render_to_response('browser/view.html',
|
||||
{
|
||||
data = RequestContext(request, {
|
||||
'repository': repository,
|
||||
'repo': repo,
|
||||
'ref': ref,
|
||||
'commit': commit,
|
||||
'diffs': diffs,
|
||||
})
|
||||
return render_to_response('browser/view.html', data)
|
||||
@permission_required('dashboard.browse')
|
||||
def blob(request, repository, path):
|
||||
repo, ref = _repo(request, repository)
|
||||
data = {
|
||||
data = RequestContext(request, {
|
||||
'repository': repository,
|
||||
'blob': repo.blob(ref, path),
|
||||
}
|
||||
})
|
||||
data.update(_log_data(request, repo, ref, path))
|
||||
data.update(_nav_data(request, repo, ref, os.path.dirname(path)))
|
||||
return render_to_response('browser/blob.html', data)
|
||||
|
|
21
dashboard/auth.py
Normal file
21
dashboard/auth.py
Normal file
|
@ -0,0 +1,21 @@
|
|||
import pam
|
||||
from django.contrib.auth.models import User, Group
|
||||
|
||||
class PAMBackend:
|
||||
def authenticate(self, username=None, password=None):
|
||||
if pam.authenticate(username, password, service='login'):
|
||||
try:
|
||||
return User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
# Create new django user
|
||||
user = User(username=username)
|
||||
user.set_password(password)
|
||||
user.save()
|
||||
user.groups.add(Group.objects.get(name='Users'))
|
||||
return user
|
||||
return None
|
||||
def get_user(self, user_id):
|
||||
try:
|
||||
return User.objects.get(pk=user_id)
|
||||
except User.DoesNotExist:
|
||||
return None
|
12
dashboard/fixtures/groups.json
Normal file
12
dashboard/fixtures/groups.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
[
|
||||
{
|
||||
"pk": 1,
|
||||
"model": "auth.group",
|
||||
"fields": {
|
||||
"name": "Users",
|
||||
"permissions": [
|
||||
["browse", "dashboard", "repository"]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
|
@ -5,5 +5,10 @@ class Repository(models.Model):
|
|||
path = models.CharField(max_length=255)
|
||||
type = models.IntegerField(default=0)
|
||||
|
||||
class Meta:
|
||||
permissions = (
|
||||
("browse", "Browse repositories"),
|
||||
)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
|
6
dashboard/urls.py
Normal file
6
dashboard/urls.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from django.conf.urls.defaults import *
|
||||
|
||||
urlpatterns = patterns('',
|
||||
(r'^login/$', 'django.contrib.auth.views.login'),
|
||||
(r'^logout/$', 'django.contrib.auth.views.logout'),
|
||||
)
|
|
@ -1,9 +1,14 @@
|
|||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from codereview.dashboard.models import Repository
|
||||
|
||||
@permission_required('dashboard.browse')
|
||||
def index(request):
|
||||
""" List available repositories
|
||||
"""
|
||||
repositories = Repository.objects.all()
|
||||
return render_to_response('dashboard/index.html',
|
||||
{'repositories': repositories})
|
||||
data = RequestContext(request, {
|
||||
'repositories': repositories,
|
||||
})
|
||||
return render_to_response('dashboard/index.html', data)
|
||||
|
|
|
@ -76,6 +76,13 @@ MIDDLEWARE_CLASSES = (
|
|||
)
|
||||
|
||||
ROOT_URLCONF = 'codereview.urls'
|
||||
LOGIN_URL = '/dashboard/login/'
|
||||
LOGIN_REDIRECT_URL = '/'
|
||||
|
||||
AUTHENTICATION_BACKENDS = (
|
||||
'django.contrib.auth.backends.ModelBackend',
|
||||
'codereview.dashboard.auth.PAMBackend',
|
||||
)
|
||||
|
||||
TEMPLATE_DIRS = (
|
||||
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
|
||||
|
|
|
@ -11,7 +11,13 @@
|
|||
<body>
|
||||
<div id="container">
|
||||
<div class="header">
|
||||
<h1><a href="{% url codereview.dashboard.views.index %}">CodeReview</a></title>
|
||||
<h1><a href="{% url codereview.dashboard.views.index %}">CodeReview</a></title></h1>
|
||||
{% if user and user.is_authenticated %}
|
||||
Currently logged in as
|
||||
{{ user }}
|
||||
|
||||
<a href="{% url django.contrib.auth.views.logout %}">Log Out</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="navigation">
|
||||
{% block navigation %}
|
||||
|
|
5
templates/registration/logged_out.html
Normal file
5
templates/registration/logged_out.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
{% extends "layouts/default.html" %}
|
||||
{% block content %}
|
||||
<p>You have been logged out.</p>
|
||||
<a href="{% url django.contrib.auth.views.login %}">Log back in</a>
|
||||
{% endblock %}
|
23
templates/registration/login.html
Normal file
23
templates/registration/login.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
{% extends "layouts/default.html" %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% if form.errors %}
|
||||
<p>Username or password is incorrect</p>
|
||||
{% endif %}
|
||||
|
||||
<form method="post" action="{% url django.contrib.auth.views.login %}">
|
||||
{% csrf_token %}
|
||||
<fieldset>
|
||||
<dl>
|
||||
<dt>{{ form.username.label_tag }}</dt>
|
||||
<dd>{{ form.username }}</dd>
|
||||
<dt>{{ form.password.label_tag }}</dt>
|
||||
<dd>{{ form.password }}</dd>
|
||||
</dl>
|
||||
<input type="submit" value="Login" />
|
||||
<input type="hidden" name="next" value="{{ next }}" />
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
2
urls.py
2
urls.py
|
@ -10,6 +10,8 @@ urlpatterns = patterns('',
|
|||
(r'^$', 'codereview.dashboard.views.index'),
|
||||
(r'^browser/', include('codereview.browser.urls')),
|
||||
|
||||
(r'^dashboard/', include('codereview.dashboard.urls')),
|
||||
|
||||
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
|
||||
# to INSTALLED_APPS to enable admin documentation:
|
||||
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||
|
|
Loading…
Reference in a new issue