Commit 7c1542c0 by benjaoming

Adding new image revisions and better looks for history page

parent fcc466d5
...@@ -21,10 +21,32 @@ class SidebarForm(forms.ModelForm, PluginSidebarFormMixin): ...@@ -21,10 +21,32 @@ class SidebarForm(forms.ModelForm, PluginSidebarFormMixin):
image.article = self.article image.article = self.article
kwargs['commit'] = False kwargs['commit'] = False
revision = super(SidebarForm, self).save(*args, **kwargs) revision = super(SidebarForm, self).save(*args, **kwargs)
revision.set_from_request(self.request)
image.add_revision(self.instance, save=True) image.add_revision(self.instance, save=True)
return revision return revision
return super(SidebarForm, self).save(*args, **kwargs) return super(SidebarForm, self).save(*args, **kwargs)
class Meta: class Meta:
model = models.ImageRevision model = models.ImageRevision
fields = ('image',) fields = ('image',)
\ No newline at end of file
class RevisionForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.image = kwargs.pop('image')
self.request = kwargs.pop('request')
super(RevisionForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
if not self.instance.id:
kwargs['commit'] = False
revision = super(RevisionForm, self).save(*args, **kwargs)
revision.set_from_request(self.request)
self.image.add_revision(self.instance, save=True)
return revision
return super(SidebarForm, self).save(*args, **kwargs)
class Meta:
model = models.ImageRevision
fields = ('image',)
...@@ -16,37 +16,37 @@ ...@@ -16,37 +16,37 @@
{% for image in images %} {% for image in images %}
{% with image.current_revision.imagerevision as revision %} {% with image.current_revision.imagerevision as revision %}
<tr> <tr>
<th>{{ revision.get_filename }}</th> <th>{{ revision.get_filename|default:_("No file") }}</th>
<th>{% trans "Markdown tag" %}</th> <th>{% trans "Markdown tag" %}</th>
<th>{% trans "Uploaded by" %}</th> <th>{% trans "Uploaded by" %}</th>
<th>{% trans "Size" %}</th> <th>{% trans "Size" %}</th>
</tr> </tr>
<tr> <tr>
<td rowspan="3"> <td rowspan="3">
{% thumbnail revision.image "250x150" crop="center" as thumb %}
<p class="thumbnail"> <p class="thumbnail">
<img src="{{ thumb.url }}" alt="{{ revision.get_filename }}" /> {% thumbnail revision.image "250x250" as thumb %}
<img src="{{ thumb.url }}" alt="{{ revision.get_filename }}" />
{% endthumbnail %}
</p>
{% if image|can_write:user %}
<p>
<a href="{% url 'wiki:images_add_revision' path=urlpath.path article_id=article.id image_id=image.id %}">
<span class="icon-upload"></span>
{% trans "Upload new image" %}
</a> <br />
{% if revision.deleted %}
<a href="{% url 'wiki:images_restore' path=urlpath.path article_id=article.id image_id=image.id %}">
<span class="icon-repeat"></span>
{% trans "Restore image" %}
</a>
{% else %}
<a href="{% url 'wiki:images_delete' path=urlpath.path article_id=article.id image_id=image.id %}">
<span class="icon-remove"></span>
{% trans "Remove image" %}
</a>
{% endif %}
</p> </p>
{% endthumbnail %}
{% if image|can_write:user %}
<p>
<a href="#">
<span class="icon-upload"></span>
{% trans "Upload new file" %}
</a> <br />
{% if revision.deleted %}
<a href="{% url 'wiki:images_restore' path=urlpath.path article_id=article.id image_id=image.id %}">
<span class="icon-repeat"></span>
{% trans "Restore image" %}
</a>
{% else %}
<a href="{% url 'wiki:images_delete' path=urlpath.path article_id=article.id image_id=image.id %}">
<span class="icon-remove"></span>
{% trans "Remove image" %}
</a>
{% endif %} {% endif %}
</p>
{% endif %}
</td> </td>
<td><code>[image:{{ image.id }}]</code></td> <td><code>[image:{{ image.id }}]</code></td>
<td> <td>
......
{% extends "wiki/article.html" %}
{% load wiki_tags i18n humanize thumbnail %}
{% load url from future %}
{% block pagetitle %}{% trans "Replace image" %}: {{ image }}{% endblock %}
{% block wiki_contents_tab %}
{% thumbnail image.current_revision.imagerevision.image "250x250" as thumb %}
<p class="thumbnail pull-right">
<img src="{{ thumb.url }}" alt="{{ revision.get_filename }}" />
</p>
{% endthumbnail %}
<p class="lead">
{% trans "Choose an image file to replace current image." %}
</p>
<form method="POST" class="form-horizontal" enctype="multipart/form-data">
{% wiki_form form %}
<div class="form-actions">
<a href="{% url 'wiki:images_index' path=urlpath.path article_id=article.id %}" class="btn">
<span class="icon-arrow-left"></span>
{% trans "Go back" %}
</a>
<button class="btn btn-primary">
<span class="icon-upload"></span>
{% trans "Upload replacement" %}
</button>
</div>
</form>
{% endblock %}
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
<td style="white-space: nowrap;"> <td style="white-space: nowrap;">
<p>{{ revision.get_filename|truncatechars:30 }}</p> <p>{{ revision.get_filename|truncatechars:30 }}</p>
<p> <p>
<a href=""><span class="icon-edit"></span> {% trans "Insert" %}</a> <br /> <a href=""><span class="icon-edit"></span> {% trans "Insert" %}</a><br />
<a href=""><span class="icon-edit"></span> {% trans "Replace" %}</a> {% if image|can_write:user %}
<a href="{% url 'wiki:images_add_revision' path=urlpath.path article_id=article.id image_id=image.id %}"><span class="icon-edit"></span> {% trans "Replace" %}</a>
{% endif %}
</p> </p>
</td> </td>
<td> <td>
......
...@@ -7,7 +7,7 @@ register = template.Library() ...@@ -7,7 +7,7 @@ register = template.Library()
@register.filter @register.filter
def images_for_article(article): def images_for_article(article):
return models.Image.objects.filter(article=article).order_by('-current_revision__created') return models.Image.objects.filter(article=article, current_revision__deleted=False).order_by('-current_revision__created')
@register.filter @register.filter
def images_can_add(article, user): def images_can_add(article, user):
......
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404, redirect
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from django.views.generic.list import ListView from django.views.generic.list import ListView
from wiki.conf import settings as wiki_settings
from wiki.decorators import get_article from wiki.decorators import get_article
from wiki.plugins.images import forms
from wiki.plugins.images import models from wiki.plugins.images import models
from wiki.views.mixins import ArticleMixin from wiki.views.mixins import ArticleMixin
from django.views.generic.edit import FormView
class ImageView(ArticleMixin, ListView): class ImageView(ArticleMixin, ListView):
...@@ -56,9 +59,9 @@ class DeleteView(ArticleMixin, RedirectView): ...@@ -56,9 +59,9 @@ class DeleteView(ArticleMixin, RedirectView):
self.image.current_revision = new_revision self.image.current_revision = new_revision
self.image.save() self.image.save()
if self.restore: if self.restore:
messages.info(self.request, _('%s has been marked as deleted') % new_revision.get_filename())
else:
messages.info(self.request, _('%s has been restored') % new_revision.get_filename()) messages.info(self.request, _('%s has been restored') % new_revision.get_filename())
else:
messages.info(self.request, _('%s has been marked as deleted') % new_revision.get_filename())
if self.urlpath: if self.urlpath:
return reverse('wiki:images_index', kwargs={'path': self.urlpath.path}) return reverse('wiki:images_index', kwargs={'path': self.urlpath.path})
return reverse('wiki:images_index', kwargs={'article_id': self.article.id}) return reverse('wiki:images_index', kwargs={'article_id': self.article.id})
...@@ -85,3 +88,37 @@ class RevisionChangeView(ArticleMixin, RedirectView): ...@@ -85,3 +88,37 @@ class RevisionChangeView(ArticleMixin, RedirectView):
if self.urlpath: if self.urlpath:
return reverse('wiki:images_index', kwargs={'path': self.urlpath.path}) return reverse('wiki:images_index', kwargs={'path': self.urlpath.path})
return reverse('wiki:images_index', kwargs={'article_id': self.article.id}) return reverse('wiki:images_index', kwargs={'article_id': self.article.id})
class RevisionAddView(ArticleMixin, FormView):
template_name = "wiki/plugins/images/revision_add.html"
form_class = forms.RevisionForm
@method_decorator(get_article(can_write=True))
def dispatch(self, request, article, *args, **kwargs):
self.image = get_object_or_404(models.Image, article=article,
id=kwargs.get('image_id', None))
if not self.image.can_write(user=request.user):
return redirect(wiki_settings.LOGIN_URL)
return ArticleMixin.dispatch(self, request, article, *args, **kwargs)
def get_form_kwargs(self, **kwargs):
kwargs = super(RevisionAddView, self).get_form_kwargs(**kwargs)
kwargs['image'] = self.image
kwargs['request'] = self.request
return kwargs
def get_context_data(self, **kwargs):
kwargs = super(RevisionAddView, self).get_context_data(**kwargs)
kwargs['image'] = self.image
return kwargs
def form_valid(self, form, **kwargs):
form.save()
messages.info(self.request, _('%(file)s has been saved.') %
{'file': self.image.current_revision.imagerevision.get_filename(),
})
if self.urlpath:
return redirect('wiki:edit', path=self.urlpath.path)
return redirect('wiki:edit', article_id=self.article.id)
...@@ -35,7 +35,8 @@ class ImagePlugin(BasePlugin): ...@@ -35,7 +35,8 @@ class ImagePlugin(BasePlugin):
url('^$', views.ImageView.as_view(), name='images_index'), url('^$', views.ImageView.as_view(), name='images_index'),
url('^delete/(?P<image_id>\d+)/$', views.DeleteView.as_view(), name='images_delete'), url('^delete/(?P<image_id>\d+)/$', views.DeleteView.as_view(), name='images_delete'),
url('^restore/(?P<image_id>\d+)/$', views.DeleteView.as_view(), name='images_restore', kwargs={'restore': True}), url('^restore/(?P<image_id>\d+)/$', views.DeleteView.as_view(), name='images_restore', kwargs={'restore': True}),
url('^restore/(?P<image_id>\d+)/set-revision/(?P<rev_id>\d+)/$', views.RevisionChangeView.as_view(), name='images_restore'), url('^(?P<image_id>\d+)/revision/change/(?P<rev_id>\d+)/$', views.RevisionChangeView.as_view(), name='images_restore'),
url('^(?P<image_id>\d+)/revision/add/$', views.RevisionAddView.as_view(), name='images_add_revision'),
) )
#markdown_extensions = [AttachmentExtension()] #markdown_extensions = [AttachmentExtension()]
......
...@@ -52,6 +52,9 @@ ...@@ -52,6 +52,9 @@
</style> </style>
{% endaddtoblock %} {% endaddtoblock %}
<p class="lead">
{% trans "Click each revision to see a list of edited lines. Click the Preview button to see how the article looked at this stage. At the bottom of this page, you can change to a particular revision or merge an old revision with the current one." %}
</p>
<form method="GET"> <form method="GET">
<div class="tab-content" style="overflow: visible;"> <div class="tab-content" style="overflow: visible;">
...@@ -60,11 +63,14 @@ ...@@ -60,11 +63,14 @@
<div class="accordion-group"> <div class="accordion-group">
<div class="accordion-heading"> <div class="accordion-heading">
<a class="accordion-toggle" style="float: left;" href="#collapse{{ revision.revision_number }}" onclick="get_diff_json('{% url 'wiki:diff' revision.id %}', $('#collapse{{ revision.revision_number }}'))"> <a class="accordion-toggle" style="float: left;" href="#collapse{{ revision.revision_number }}" onclick="get_diff_json('{% url 'wiki:diff' revision.id %}', $('#collapse{{ revision.revision_number }}'))">
<span class="icon-plus"></span>
{% include "wiki/includes/revision_info.html" with current_revision=article.current_revision %} {% include "wiki/includes/revision_info.html" with current_revision=article.current_revision %}
<div style="color: #CCC;"> <div style="color: #CCC;">
<small> <small>
{% if revision.user_message %} {% if revision.user_message %}
{{ revision.user_message }} {{ revision.user_message }}
{% elif revision.automatic_log %}
{{ revision.automatic_log }}
{% else %} {% else %}
({% trans "no log message" %}) ({% trans "no log message" %})
{% endif %} {% endif %}
...@@ -78,18 +84,14 @@ ...@@ -78,18 +84,14 @@
{% if revision == article.current_revision %} {% if revision == article.current_revision %}
<a href="#" class="btn disabled"> <a href="#" class="btn disabled">
<span class="icon-lock"></span> <span class="icon-lock"></span>
{% trans "Preview this version" %} {% trans "Preview this revision" %}
</a> </a>
{% else %} {% else %}
<button type="submit" class="btn" onclick="$('#previewModal').modal('show'); this.form.target='previewWindow'; this.form.r.value='{{ revision.id }}'; this.form.action='{% url 'wiki:preview_revision' article.id %}'; $('#previewModal .switch-to-revision').attr('href', '{% url 'wiki:change_revision' path=urlpath.path article_id=article.id revision_id=revision.id %}')"> <button type="submit" class="btn" onclick="$('#previewModal').modal('show'); this.form.target='previewWindow'; this.form.r.value='{{ revision.id }}'; this.form.action='{% url 'wiki:preview_revision' article.id %}'; $('#previewModal .switch-to-revision').attr('href', '{% url 'wiki:change_revision' path=urlpath.path article_id=article.id revision_id=revision.id %}')">
<span class="icon-eye-open"></span> <span class="icon-eye-open"></span>
{% trans "Preview this version" %} {% trans "Preview this revision" %}
</button> </button>
{% endif %} {% endif %}
<a class="btn btn-info" href="#collapse{{ revision.revision_number }}" onclick="get_diff_json('{% url 'wiki:diff' revision_id=revision.id %}', $('#collapse{{ revision.revision_number }}'))">
<span class="icon-list-alt"></span>
{% trans "Show changes" %}
</a>
{% if article|can_write:user %} {% if article|can_write:user %}
<input type="radio"{% if revision == article.current_revision %} disabled="true"{% endif %} style="margin: 0 10px;" value="{{ revision.id }}" name="revision_id" switch-button-href="{% url 'wiki:change_revision' path=urlpath.path revision_id=revision.id %}" merge-button-href="{% url 'wiki:merge_revision_preview' article_id=article.id revision_id=revision.id %}" merge-button-commit-href="{% url 'wiki:merge_revision' path=urlpath.path article_id=article.id revision_id=revision.id %}" /> <input type="radio"{% if revision == article.current_revision %} disabled="true"{% endif %} style="margin: 0 10px;" value="{{ revision.id }}" name="revision_id" switch-button-href="{% url 'wiki:change_revision' path=urlpath.path revision_id=revision.id %}" merge-button-href="{% url 'wiki:merge_revision_preview' article_id=article.id revision_id=revision.id %}" merge-button-commit-href="{% url 'wiki:merge_revision' path=urlpath.path article_id=article.id revision_id=revision.id %}" />
......
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