Commit a7e746d3 by David Ormsbee

Merge

parents 63cb53c9 f6ad9d51
...@@ -107,17 +107,17 @@ def render_x_module(user, request, xml_module, module_object_preload): ...@@ -107,17 +107,17 @@ def render_x_module(user, request, xml_module, module_object_preload):
module_id=xml_module.get('id') #module_class.id_attribute) or "" module_id=xml_module.get('id') #module_class.id_attribute) or ""
# Grab state from database # Grab state from database
#s = object_cache(module_object_preload, s = object_cache(module_object_preload,
# user, user,
# module_type, module_type,
# module_id) module_id)
s = StudentModule.objects.filter(student=request.user, # s = StudentModule.objects.filter(student=request.user,
module_id=module_id, # module_id=module_id,
module_type = module_type) # module_type = module_type)
if len(s) == 0: # if len(s) == 0:
s=None # s=None
else: # else:
s=s[0] # s=s[0]
if s == None: # If nothing in the database... if s == None: # If nothing in the database...
state=None state=None
...@@ -141,6 +141,7 @@ def render_x_module(user, request, xml_module, module_object_preload): ...@@ -141,6 +141,7 @@ def render_x_module(user, request, xml_module, module_object_preload):
module_id=module_id, module_id=module_id,
state=instance.get_state()) state=instance.get_state())
smod.save() # This may be optional (at least in the case of no instance in the dB) smod.save() # This may be optional (at least in the case of no instance in the dB)
module_object_preload.append(smod)
# Grab content # Grab content
content = {'content':instance.get_html(), content = {'content':instance.get_html(),
"destroy_js":instance.get_destroy_js(), "destroy_js":instance.get_destroy_js(),
......
class completion(object):
def __init__(self, d=None):
self.dict = dict()
if d:
self.dict.update(d)
def __getitem__(self, key):
return self.dict[key]
def __setitem__(self, key, value):
self.dict[key] = value
def __add__(self, other):
result = dict()
dict.update(self.dict)
dict.update(other.dict)
def __contains__(self, key):
pass
...@@ -132,8 +132,8 @@ def index(request, course="6.002 Spring 2012", chapter="Using the System", secti ...@@ -132,8 +132,8 @@ def index(request, course="6.002 Spring 2012", chapter="Using the System", secti
module_ids = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]//@id", module_ids = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]//@id",
course=course, chapter=chapter, section=section) course=course, chapter=chapter, section=section)
module_object_preload = StudentModule.objects.filter(student=user, module_object_preload = list(StudentModule.objects.filter(student=user,
module_id__in=module_ids) module_id__in=module_ids))
module=render_module(user, request, module, module_object_preload) module=render_module(user, request, module, module_object_preload)
......
...@@ -85,6 +85,8 @@ class Article(models.Model): ...@@ -85,6 +85,8 @@ class Article(models.Model):
def can_read(self, user): def can_read(self, user):
""" Check read permissions and return True/False.""" """ Check read permissions and return True/False."""
if user.is_superuser:
return True
if self.permissions: if self.permissions:
perms = self.permissions.can_read.all() perms = self.permissions.can_read.all()
return perms.count() == 0 or (user in perms) return perms.count() == 0 or (user in perms)
...@@ -93,6 +95,8 @@ class Article(models.Model): ...@@ -93,6 +95,8 @@ class Article(models.Model):
def can_write(self, user): def can_write(self, user):
""" Check write permissions and return True/False.""" """ Check write permissions and return True/False."""
if user.is_superuser:
return True
if self.permissions: if self.permissions:
perms = self.permissions.can_write.all() perms = self.permissions.can_write.all()
return perms.count() == 0 or (user in perms) return perms.count() == 0 or (user in perms)
...@@ -101,6 +105,8 @@ class Article(models.Model): ...@@ -101,6 +105,8 @@ class Article(models.Model):
def can_write_l(self, user): def can_write_l(self, user):
"""Check write permissions and locked status""" """Check write permissions and locked status"""
if user.is_superuser:
return True
return not self.locked and self.can_write(user) return not self.locked and self.can_write(user)
def can_attach(self, user): def can_attach(self, user):
...@@ -220,13 +226,25 @@ class Revision(models.Model): ...@@ -220,13 +226,25 @@ class Revision(models.Model):
counter = models.IntegerField(verbose_name=_('Revision#'), default=1, editable=False) counter = models.IntegerField(verbose_name=_('Revision#'), default=1, editable=False)
previous_revision = models.ForeignKey('self', blank=True, null=True, editable=False) previous_revision = models.ForeignKey('self', blank=True, null=True, editable=False)
# Deleted has three values. 0 is normal, non-deleted. 1 is if it was deleted by a normal user. It should
# be a NEW revision, so that it appears in the history. 2 is a special flag that can be applied or removed
# from a normal revision. It means it has been admin-deleted, and can only been seen by an admin. It doesn't
# show up in the history.
deleted = models.IntegerField(verbose_name=_('Deleted group'), default=0)
def get_user(self): def get_user(self):
return self.revision_user if self.revision_user else _('Anonymous') return self.revision_user if self.revision_user else _('Anonymous')
# Called after the deleted fied has been changed (between 0 and 2). This bypasses the normal checks put in
# save that update the revision or reject the save if contents haven't changed
def adminSetDeleted(self, deleted):
self.deleted = deleted
super(Revision, self).save()
def save(self, **kwargs): def save(self, **kwargs):
# Check if contents have changed... if not, silently ignore save # Check if contents have changed... if not, silently ignore save
if self.article and self.article.current_revision: if self.article and self.article.current_revision:
if self.article.current_revision.contents == self.contents: if self.deleted == 0 and self.article.current_revision.contents == self.contents:
return return
else: else:
import datetime import datetime
...@@ -242,7 +260,8 @@ class Revision(models.Model): ...@@ -242,7 +260,8 @@ class Revision(models.Model):
self.counter = previous_revision[0].counter + 1 self.counter = previous_revision[0].counter + 1
else: else:
self.counter = 1 self.counter = 1
self.previous_revision = self.article.current_revision if (self.article.current_revision and self.article.current_revision.deleted == 0):
self.previous_revision = self.article.current_revision
# Create pre-parsed contents - no need to parse on-the-fly # Create pre-parsed contents - no need to parse on-the-fly
ext = WIKI_MARKDOWN_EXTENSIONS ext = WIKI_MARKDOWN_EXTENSIONS
...@@ -274,6 +293,10 @@ class Revision(models.Model): ...@@ -274,6 +293,10 @@ class Revision(models.Model):
super(Revision, self).delete(**kwargs) super(Revision, self).delete(**kwargs)
def get_diff(self): def get_diff(self):
if (self.deleted == 1):
yield "Article Deletion"
return
if self.previous_revision: if self.previous_revision:
previous = self.previous_revision.contents.splitlines(1) previous = self.previous_revision.contents.splitlines(1)
else: else:
......
...@@ -32,12 +32,13 @@ def view(request, wiki_url): ...@@ -32,12 +32,13 @@ def view(request, wiki_url):
if err: if err:
return err return err
perm_err = check_permissions(request, article, check_read=True) perm_err = check_permissions(request, article, check_read=True, check_deleted=True)
if perm_err: if perm_err:
return perm_err return perm_err
d = {'wiki_article': article, d = {'wiki_article': article,
'wiki_write': article.can_write_l(request.user), 'wiki_write': article.can_write_l(request.user),
'wiki_attachments_write': article.can_attach(request.user), 'wiki_attachments_write': article.can_attach(request.user),
'wiki_current_revision_deleted' : not (article.current_revision.deleted == 0),
} }
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_view.html', d) return render_to_response('simplewiki_view.html', d)
...@@ -80,7 +81,7 @@ def create(request, wiki_url): ...@@ -80,7 +81,7 @@ def create(request, wiki_url):
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_error.html', d) return render_to_response('simplewiki_error.html', d)
perm_err = check_permissions(request, path[-1], check_locked=False, check_write=True) perm_err = check_permissions(request, path[-1], check_locked=False, check_write=True, check_deleted=True)
if perm_err: if perm_err:
return perm_err return perm_err
# Ensure doesn't already exist # Ensure doesn't already exist
...@@ -135,7 +136,7 @@ def edit(request, wiki_url): ...@@ -135,7 +136,7 @@ def edit(request, wiki_url):
return err return err
# Check write permissions # Check write permissions
perm_err = check_permissions(request, article, check_write=True, check_locked=True) perm_err = check_permissions(request, article, check_write=True, check_locked=True, check_deleted=False)
if perm_err: if perm_err:
return perm_err return perm_err
...@@ -149,9 +150,15 @@ def edit(request, wiki_url): ...@@ -149,9 +150,15 @@ def edit(request, wiki_url):
if f.is_valid(): if f.is_valid():
new_revision = f.save(commit=False) new_revision = f.save(commit=False)
new_revision.article = article new_revision.article = article
# Check that something has actually been changed...
if not new_revision.get_diff(): if request.POST.__contains__('delete'):
return (None, HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))) if (article.current_revision.deleted == 1): #This article has already been deleted. Redirect
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
new_revision.contents = ""
new_revision.deleted = 1
elif not new_revision.get_diff():
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
if not request.user.is_anonymous(): if not request.user.is_anonymous():
new_revision.revision_user = request.user new_revision.revision_user = request.user
new_revision.save() new_revision.save()
...@@ -160,7 +167,9 @@ def edit(request, wiki_url): ...@@ -160,7 +167,9 @@ def edit(request, wiki_url):
new_revision.article.save() new_revision.article.save()
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
else: else:
f = EditForm({'contents': article.current_revision.contents, 'title': article.title}) startContents = article.current_revision.contents if (article.current_revision.deleted == 0) else 'Headline\n===\n\n'
f = EditForm({'contents': startContents, 'title': article.title})
d = {'wiki_form': f, d = {'wiki_form': f,
'wiki_write': True, 'wiki_write': True,
'wiki_article': article, 'wiki_article': article,
...@@ -178,8 +187,9 @@ def history(request, wiki_url, page=1): ...@@ -178,8 +187,9 @@ def history(request, wiki_url, page=1):
if err: if err:
return err return err
perm_err = check_permissions(request, article, check_read=True) perm_err = check_permissions(request, article, check_read=True, check_deleted=False)
if perm_err: if perm_err:
print "returned error " , perm_err
return perm_err return perm_err
page_size = 10 page_size = 10
...@@ -192,18 +202,41 @@ def history(request, wiki_url, page=1): ...@@ -192,18 +202,41 @@ def history(request, wiki_url, page=1):
history = Revision.objects.filter(article__exact = article).order_by('-counter') history = Revision.objects.filter(article__exact = article).order_by('-counter')
if request.method == 'POST': if request.method == 'POST':
if request.POST.__contains__('revision'): if request.POST.__contains__('revision'): #They selected a version, but they can be either deleting or changing the version
perm_err = check_permissions(request, article, check_write=True, check_locked=True) perm_err = check_permissions(request, article, check_write=True, check_locked=True)
if perm_err: if perm_err:
return perm_err return perm_err
try: try:
r = int(request.POST['revision']) r = int(request.POST['revision'])
article.current_revision = Revision.objects.get(id=r) revision = Revision.objects.get(id=r)
article.save() if request.POST.__contains__('change'):
article.current_revision = revision
article.save()
elif request.POST.__contains__('delete') and request.user.is_superuser:
if (revision.deleted == 0):
revision.adminSetDeleted(2)
elif request.POST.__contains__('restore') and request.user.is_superuser:
if (revision.deleted == 2):
revision.adminSetDeleted(0)
elif request.POST.__contains__('delete_all') and request.user.is_superuser:
Revision.objects.filter(article__exact = article, deleted = 0).update(deleted = 2)
elif request.POST.__contains__('lock_article'):
print "changing locked article " , article.locked
article.locked = not article.locked
print "changed locked article " , article.locked
article.save()
except: except:
pass pass
finally: finally:
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
#
#
# <input type="submit" name="delete" value="Delete revision"/>
# <input type="submit" name="restore" value="Restore revision"/>
# <input type="submit" name="delete_all" value="Delete all revisions">
# %else:
# <input type="submit" name="delete_article" value="Delete all revisions">
#
page_count = (history.count()+(page_size-1)) / page_size page_count = (history.count()+(page_size-1)) / page_size
if p > page_count: if p > page_count:
...@@ -219,7 +252,8 @@ def history(request, wiki_url, page=1): ...@@ -219,7 +252,8 @@ def history(request, wiki_url, page=1):
'wiki_write': article.can_write_l(request.user), 'wiki_write': article.can_write_l(request.user),
'wiki_attachments_write': article.can_attach(request.user), 'wiki_attachments_write': article.can_attach(request.user),
'wiki_article': article, 'wiki_article': article,
'wiki_history': history[beginItem:beginItem+page_size],} 'wiki_history': history[beginItem:beginItem+page_size],
'show_delete_revision' : request.user.is_superuser,}
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_history.html', d) return render_to_response('simplewiki_history.html', d)
...@@ -253,12 +287,17 @@ def search_articles(request): ...@@ -253,12 +287,17 @@ def search_articles(request):
else: else:
# Need to throttle results by splitting them into pages... # Need to throttle results by splitting them into pages...
results = Article.objects.all() results = Article.objects.all()
if request.user.is_superuser:
results = results.order_by('current_revision__deleted')
else:
results = results.filter(current_revision__deleted = 0)
if results.count() == 1 and querystring: if results.count() == 1 and querystring:
return HttpResponseRedirect(reverse('wiki_view', args=(results[0].get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(results[0].get_url(),)))
else: else:
d = {'wiki_search_results': results, d = {'wiki_search_results': results,
'wiki_search_query': querystring} 'wiki_search_query': querystring,}
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_searchresults.html', d) return render_to_response('simplewiki_searchresults.html', d)
...@@ -394,16 +433,24 @@ def fetch_from_url(request, url): ...@@ -394,16 +433,24 @@ def fetch_from_url(request, url):
return (article, path, err) return (article, path, err)
def check_permissions(request, article, check_read=False, check_write=False, check_locked=False): def check_permissions(request, article, check_read=False, check_write=False, check_locked=False, check_deleted=False):
read_err = check_read and not article.can_read(request.user) read_err = check_read and not article.can_read(request.user)
write_err = check_write and not article.can_write(request.user) write_err = check_write and not article.can_write(request.user)
locked_err = check_locked and article.locked locked_err = check_locked and article.locked
if read_err or write_err or locked_err: deleted_err = check_deleted and not (article.current_revision.deleted == 0)
if (request.user.is_superuser):
deleted_err = False
locked_err = False
if read_err or write_err or locked_err or deleted_err:
d = {'wiki_article': article, d = {'wiki_article': article,
'wiki_err_noread': read_err, 'wiki_err_noread': read_err,
'wiki_err_nowrite': write_err, 'wiki_err_nowrite': write_err,
'wiki_err_locked': locked_err,} 'wiki_err_locked': locked_err,
'wiki_err_deleted': deleted_err,}
d.update(csrf(request)) d.update(csrf(request))
# TODO: Make this a little less jarring by just displaying an error # TODO: Make this a little less jarring by just displaying an error
# on the current page? (no such redirect happens for an anon upload yet) # on the current page? (no such redirect happens for an anon upload yet)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment