apply new pre-commit hooks (#85632)
gitea/barbacompta/pipeline/head This commit looks good Details

This commit is contained in:
Benjamin Dauvergne 2024-01-15 10:20:28 +01:00
parent b62fa2b3b5
commit a93ca78c8a
71 changed files with 675 additions and 707 deletions

View File

@ -2,3 +2,5 @@
25ef1599be197445f48680306846bbfb19590502 25ef1599be197445f48680306846bbfb19590502
# misc: apply double-quote-string-fixer (#79788) # misc: apply double-quote-string-fixer (#79788)
f1941a3ad8fd726321ce19b2e0ce22a2a5911a6c f1941a3ad8fd726321ce19b2e0ce22a2a5911a6c
# apply new pre-commit hooks (#85632)
42ad175c4b191655a907ccae03c817f631a4dcbb

View File

@ -1,4 +1,4 @@
debian/barbacompta-manage /usr/bin debian/barbacompta-manage /usr/bin
debian/barbacompta.service /lib/systemd/system
debian/config.py /etc/barbacompta debian/config.py /etc/barbacompta
debian/uwsgi.ini /etc/barbacompta debian/uwsgi.ini /etc/barbacompta
debian/barbacompta.service /lib/systemd/system

39
debian/control vendored
View File

@ -2,28 +2,37 @@ Source: barbacompta
Section: python Section: python
Priority: optional Priority: optional
Maintainer: Benjamin Dauvergne <bdauvergne@entrouvert.com> Maintainer: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Build-Depends: python3-setuptools, python3-all, python3-django, debhelper-compat (= 12), dh-python, sassc Build-Depends: debhelper-compat (= 12),
dh-python,
python3-all,
python3-django,
python3-setuptools,
sassc,
Standards-Version: 3.9.6 Standards-Version: 3.9.6
Homepage: https://dev.entrouvert.org/projects/barbacompta Homepage: https://dev.entrouvert.org/projects/barbacompta
Package: python3-barbacompta Package: python3-barbacompta
Architecture: all Architecture: all
Depends: ${misc:Depends}, ${python3:Depends}, Depends: python3-cairosvg,
python3-django (>= 2:3.2), python3-caldav,
python3-cairosvg, python3-django (>= 2:3.2),
python3-facturx, python3-django-mellon,
python3-xstatic-select2, python3-facturx,
python3-gadjo, python3-gadjo,
python3-django-mellon, python3-xstatic-select2,
weasyprint, weasyprint,
python3-caldav, ${misc:Depends},
${python3:Depends},
Description: Logiciel de compta/facturation interne Description: Logiciel de compta/facturation interne
Package: barbacompta Package: barbacompta
Architecture: all Architecture: all
Depends: ${misc:Depends}, Depends: python3-barbacompta (= ${binary:Version}),
python3-barbacompta (= ${binary:Version}), python3-psycopg2,
python3-psycopg2 ${misc:Depends},
Description: Logiciel de compta/facturation interne Description: Logiciel de compta/facturation interne
Recommends: nginx, uwsgi, uwsgi-plugin-python3, python3-uwsgidecorators Recommends: nginx,
Suggests: postgresql python3-uwsgidecorators,
uwsgi,
uwsgi-plugin-python3,
Suggests: postgresql,

View File

@ -22,7 +22,7 @@ import zipfile
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.http import HttpResponse from django.http import HttpResponse
from django.template import Context, Template from django.template import Context, Template
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
def export_as_csv(modeladmin, request, queryset): def export_as_csv(modeladmin, request, queryset):

View File

@ -6,7 +6,6 @@ import eo_gestion.chorus.validators
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [] dependencies = []

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
def validate_luhn(string_value, length=None): def validate_luhn(string_value, length=None):

View File

@ -70,16 +70,14 @@ class LigneBanquePopAdmin(admin.ModelAdmin):
actions = [actions.export_as_csv] actions = [actions.export_as_csv]
list_filter = (MontantAffecteFilter,) list_filter = (MontantAffecteFilter,)
@admin.display(description='Montant')
def column_montant(self, obj): def column_montant(self, obj):
return amountformat(obj.montant) return amountformat(obj.montant)
column_montant.short_description = 'Montant' @admin.display(description='Montant non affecté')
def column_montant_non_affecte(self, obj): def column_montant_non_affecte(self, obj):
return amountformat(obj.montant_non_affecte()) return amountformat(obj.montant_non_affecte())
column_montant_non_affecte.short_description = 'Montant non affecté'
def lookup_allowed(self, *args, **kwargs): def lookup_allowed(self, *args, **kwargs):
return True return True

View File

@ -15,7 +15,7 @@ class Command(BaseCommand):
can_import_django_settings = True can_import_django_settings = True
output_transaction = True output_transaction = True
requires_system_checks = True requires_system_checks = '__all__'
args = '<csv_file> <csv_file>...' args = '<csv_file> <csv_file>...'
help = 'Charge les fichiers CSVs' help = 'Charge les fichiers CSVs'
HEADER = [ HEADER = [

View File

@ -13,7 +13,7 @@ class Command(BaseCommand):
can_import_django_settings = True can_import_django_settings = True
output_transaction = True output_transaction = True
requires_system_checks = True requires_system_checks = '__all__'
args = '<csv_file> <csv_file>...' args = '<csv_file> <csv_file>...'
help = 'Charge le solde courant' help = 'Charge le solde courant'

View File

@ -13,7 +13,7 @@ class Command(BaseCommand):
can_import_django_settings = True can_import_django_settings = True
output_transaction = True output_transaction = True
requires_system_checks = True requires_system_checks = '__all__'
args = '<csv_file> <csv_file>...' args = '<csv_file> <csv_file>...'
help = 'Charge le solde courant' help = 'Charge le solde courant'

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('contenttypes', '0001_initial'), ('contenttypes', '0001_initial'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_banque', '0001_initial'), ('eo_banque', '0001_initial'),
] ]

View File

@ -2,11 +2,11 @@
{% load i18n %} {% load i18n %}
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
<ul class="object-tools"> <ul class="object-tools">
<li><a href="history/" class="historylink">{% trans "History" %}</a></li> <li><a href="history/" class="historylink">{% trans "History" %}</a></li>
<li><a href="{% url "admin:eo_facture_payment_add" %}?ligne_banque_pop={{original.id}}&montant_affecte={{original.montant_non_affecte|stringformat:"f"}}" class="historylink">Ajouter comme paiement</a></li> <li><a href="{% url "admin:eo_facture_payment_add" %}?ligne_banque_pop={{original.id}}&montant_affecte={{original.montant_non_affecte|stringformat:"f"}}" class="historylink">Ajouter comme paiement</a></li>
</ul> </ul>
{% endif %}{% endif %} {% endif %}{% endif %}
{% endblock %} {% endblock %}

View File

@ -1,18 +1,18 @@
{% load eo_facture %} {% load eo_facture %}
<div class="module" id="finances"> <div class="module" id="finances">
<h2>Finance</h2> <h2>Finance</h2>
<p>Solde: {{ solde|amountformat }} €</p> <p>Solde: {{ solde|amountformat }} €</p>
<table class="table"> <table class="table">
<thead><th class="mois">Mois</th><th class="montant">Encaissements</th><th>Dépenses</th><th>Solde</th></thead> <thead><th class="mois">Mois</th><th class="montant">Encaissements</th><th>Dépenses</th><th>Solde</th></thead>
<tbody> <tbody>
{% for periode in finances %} {% for periode in finances %}
<tr> <tr>
<td class="mois"><a href="{{ periode.lien_date }}">{{ periode.date|date:"M Y" }}<a/></td> <td class="mois"><a href="{{ periode.lien_date }}">{{ periode.date|date:"M Y" }}<a/></td>
<td class="montant"><a href="{{ periode.lien_encaissement }}">{{periode.encaissement|amountformat}} €</a></td> <td class="montant"><a href="{{ periode.lien_encaissement }}">{{periode.encaissement|amountformat}} €</a></td>
<td class="montant"><a href="{{ periode.lien_depense }}">{{periode.depense|amountformat}} €</a></td> <td class="montant"><a href="{{ periode.lien_depense }}">{{periode.depense|amountformat}} €</a></td>
<td class="montant">{{periode.solde|amountformat}} €</td> <td class="montant">{{periode.solde|amountformat}} €</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -1,6 +1,6 @@
{% load eo_facture %} {% load eo_facture %}
<div id="ligne_banque_pop_total"> <div id="ligne_banque_pop_total">
<p>Crédit: {{ credit|amountformat }} €</p> <p>Crédit: {{ credit|amountformat }} €</p>
<p>Débit: {{ debit|amountformat }} €</p> <p>Débit: {{ debit|amountformat }} €</p>
<p>Total: {{ total|amountformat }} €</p> <p>Total: {{ total|amountformat }} €</p>
</div> </div>

View File

@ -21,7 +21,6 @@ from io import BytesIO
from adminsortable2.admin import SortableInlineAdminMixin from adminsortable2.admin import SortableInlineAdminMixin
from django import http from django import http
from django.conf.urls import url
from django.contrib import admin from django.contrib import admin
from django.contrib.admin.options import BaseModelAdmin from django.contrib.admin.options import BaseModelAdmin
from django.contrib.humanize.templatetags.humanize import ordinal from django.contrib.humanize.templatetags.humanize import ordinal
@ -30,7 +29,7 @@ from django.db.models import Exists, OuterRef, TextField
from django.forms import Textarea from django.forms import Textarea
from django.forms.models import BaseInlineFormSet from django.forms.models import BaseInlineFormSet
from django.shortcuts import render from django.shortcuts import render
from django.urls import path, reverse from django.urls import path, re_path, reverse
from django.utils.html import format_html from django.utils.html import format_html
import eo_gestion.admin import eo_gestion.admin
@ -210,6 +209,10 @@ class ClientAdmin(admin.ModelAdmin):
css = {'all': ('css/client.css',)} css = {'all': ('css/client.css',)}
@admin.display(
description='Client',
ordering='client',
)
def show_client(obj): def show_client(obj):
if obj.client: if obj.client:
url = reverse('admin:eo_facture_client_change', args=[obj.client.id]) url = reverse('admin:eo_facture_client_change', args=[obj.client.id])
@ -218,10 +221,6 @@ def show_client(obj):
return '' return ''
show_client.short_description = 'Client'
show_client.admin_order_field = 'client'
class MyContratsFilter(admin.SimpleListFilter): class MyContratsFilter(admin.SimpleListFilter):
title = 'CPF' title = 'CPF'
parameter_name = 'cpf' parameter_name = 'cpf'
@ -278,11 +277,10 @@ class ContratAdmin(LookupAllowed, admin.ModelAdmin):
actions = [actions.export_references_as_fodt] actions = [actions.export_references_as_fodt]
autocomplete_fields = ['client'] autocomplete_fields = ['client']
@admin.display(description='Montant')
def column_montant(self, obj): def column_montant(self, obj):
return amountformat(obj.montant()) return amountformat(obj.montant())
column_montant.short_description = 'Montant'
def get_queryset(self, request): def get_queryset(self, request):
qs = super().get_queryset(request) qs = super().get_queryset(request)
return qs.prefetch_related('prestations', 'factures__lignes', 'tags') return qs.prefetch_related('prestations', 'factures__lignes', 'tags')
@ -362,7 +360,7 @@ class ContratAdmin(LookupAllowed, admin.ModelAdmin):
duplicate_view = self.admin_site.admin_view(self.duplicate) duplicate_view = self.admin_site.admin_view(self.duplicate)
facturer_echeance_view = self.admin_site.admin_view(self.facturer_echeance) facturer_echeance_view = self.admin_site.admin_view(self.facturer_echeance)
my_urls = [ my_urls = [
url(r'^(.+)/duplicate/$', duplicate_view, name='eo_facture_contrat_duplicate'), re_path(r'^(.+)/duplicate/$', duplicate_view, name='eo_facture_contrat_duplicate'),
path( path(
'<path:object_id>/facturer-echeance/', '<path:object_id>/facturer-echeance/',
facturer_echeance_view, facturer_echeance_view,
@ -372,13 +370,11 @@ class ContratAdmin(LookupAllowed, admin.ModelAdmin):
return my_urls + urls return my_urls + urls
@admin.display(description='Ordre')
def index(facture): def index(facture):
return format_html('{0}', ordinal(facture.index())) return format_html('{0}', ordinal(facture.index()))
index.short_description = 'Ordre'
class FactureAdmin(LookupAllowed, admin.ModelAdmin): class FactureAdmin(LookupAllowed, admin.ModelAdmin):
form = forms.FactureForm form = forms.FactureForm
inlines = [LigneInline, PaymentInline] inlines = [LigneInline, PaymentInline]
@ -423,29 +419,25 @@ class FactureAdmin(LookupAllowed, admin.ModelAdmin):
actions = [actions.export_invoices_as_zip] actions = [actions.export_invoices_as_zip]
autocomplete_fields = ['client'] autocomplete_fields = ['client']
@admin.display(description='Code')
def column_code(self, obj): def column_code(self, obj):
if obj.montant < 0: if obj.montant < 0:
return 'Avoir %s' % obj.code() return 'Avoir %s' % obj.code()
else: else:
return obj.code() return obj.code()
column_code.short_description = 'Code' @admin.display(description='Montant')
def column_montant(self, obj): def column_montant(self, obj):
return amountformat(obj.montant) return amountformat(obj.montant)
column_montant.short_description = 'Montant' @admin.display(description='Montant TTC')
def column_montant_ttc(self, obj): def column_montant_ttc(self, obj):
return amountformat(obj.montant_ttc) return amountformat(obj.montant_ttc)
column_montant_ttc.short_description = 'Montant TTC' @admin.display(description='Solde')
def column_solde(self, obj): def column_solde(self, obj):
return amountformat(obj.solde()) return amountformat(obj.solde())
column_solde.short_description = 'Solde'
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):
# ne pas supprimer les factures émises # ne pas supprimer les factures émises
if obj and not obj.proforma: if obj and not obj.proforma:
@ -521,29 +513,31 @@ class FactureAdmin(LookupAllowed, admin.ModelAdmin):
def get_urls(self): def get_urls(self):
urls = super().get_urls() urls = super().get_urls()
my_urls = [ my_urls = [
url(r'^view/([^/]*)', views.facture), re_path(r'^view/([^/]*)', views.facture),
url( path(
r'^add_simple/$', 'add_simple/',
self.admin_site.admin_view(self.add_simple), self.admin_site.admin_view(self.add_simple),
name='eo_facture_facture_add_simple', name='eo_facture_facture_add_simple',
), ),
url( re_path(
r'^(.+)/view_pdf/', r'^(.+)/view_pdf/',
self.admin_site.admin_view(views.facture_pdf), self.admin_site.admin_view(views.facture_pdf),
name='eo_facture_facture_print', name='eo_facture_facture_print',
), ),
url(r'^(.+)/view/$', self.admin_site.admin_view(views.facture), name='eo_facture_facture_html'), re_path(
url( r'^(.+)/view/$', self.admin_site.admin_view(views.facture), name='eo_facture_facture_html'
),
re_path(
r'^(.+)/send-to-chorus/', r'^(.+)/send-to-chorus/',
self.admin_site.admin_view(views.send_to_chorus), self.admin_site.admin_view(views.send_to_chorus),
name='eo_facture_facture_send_to_chorus', name='eo_facture_facture_send_to_chorus',
), ),
url( path(
r'^sheet/$', 'sheet/',
self.admin_site.admin_view(self.sheet), self.admin_site.admin_view(self.sheet),
name='eo_facture_facture_sheet', name='eo_facture_facture_sheet',
), ),
url( re_path(
r'^(.+)/cancel/', r'^(.+)/cancel/',
self.admin_site.admin_view(views.cancel), self.admin_site.admin_view(views.cancel),
name='eo_facture_facture_cancel', name='eo_facture_facture_cancel',
@ -551,13 +545,13 @@ class FactureAdmin(LookupAllowed, admin.ModelAdmin):
] ]
return my_urls + urls return my_urls + urls
@admin.display(description='Client')
def show_client(self, obj): def show_client(self, obj):
if obj.client: if obj.client:
url = reverse('admin:eo_facture_client_change', args=[obj.client.id]) url = reverse('admin:eo_facture_client_change', args=[obj.client.id])
return format_html('<a href="{0}">{1}</a>', url, obj.client) return format_html('<a href="{0}">{1}</a>', url, obj.client)
show_client.short_description = 'Client' @admin.display(description='Contrat / Intitulé')
def show_contrat(self, obj): def show_contrat(self, obj):
if obj.contrat: if obj.contrat:
url = reverse('admin:eo_facture_contrat_change', args=[obj.contrat.id]) url = reverse('admin:eo_facture_contrat_change', args=[obj.contrat.id])
@ -567,8 +561,6 @@ class FactureAdmin(LookupAllowed, admin.ModelAdmin):
return format_html('<a href="{0}">{1}</a>', url, obj.contrat) return format_html('<a href="{0}">{1}</a>', url, obj.contrat)
return format_html('Pas de contrat<br />{0}', obj.intitule) return format_html('Pas de contrat<br />{0}', obj.intitule)
show_contrat.short_description = 'Contrat / Intitulé'
# adapt get_object and get_changelist_instance to produce and accept URL # adapt get_object and get_changelist_instance to produce and accept URL
# with facture's code # with facture's code
FACTURE_RE = re.compile('^F(?P<year>20[0-9]{2})(?P<ordre>[0-9]{4})$') FACTURE_RE = re.compile('^F(?P<year>20[0-9]{2})(?P<ordre>[0-9]{4})$')

View File

@ -21,7 +21,7 @@ from django import forms
from django.core import validators from django.core import validators
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
class PercentagePerYear(list): class PercentagePerYear(list):

View File

@ -9,7 +9,6 @@ import eo_gestion.eo_facture.models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_banque', '0001_initial'), ('eo_banque', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0001_initial'), ('eo_facture', '0001_initial'),
] ]

View File

@ -19,7 +19,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0002_facture_account_on_previous_period'), ('eo_facture', '0002_facture_account_on_previous_period'),
] ]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0003_client_picture'), ('eo_facture', '0003_client_picture'),
] ]

View File

@ -19,7 +19,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0004_contrat_public_description'), ('eo_facture', '0004_contrat_public_description'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0005_contrat_image'), ('eo_facture', '0005_contrat_image'),
] ]

View File

@ -21,7 +21,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0006_client_contacts'), ('eo_facture', '0006_client_contacts'),
] ]

View File

@ -6,7 +6,6 @@ import eo_gestion.eo_facture.validators
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0007_auto_20191009_1335'), ('eo_facture', '0007_auto_20191009_1335'),
] ]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('chorus', '__first__'), ('chorus', '__first__'),
('eo_facture', '0008_auto_20200201_1559'), ('eo_facture', '0008_auto_20200201_1559'),

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0009_client_chorus_structure'), ('eo_facture', '0009_client_chorus_structure'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0010_auto_20200316_1616'), ('eo_facture', '0010_auto_20200316_1616'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0011_contrat_url'), ('eo_facture', '0011_contrat_url'),
] ]

View File

@ -6,7 +6,6 @@ import eo_gestion.eo_facture.taggit
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('taggit', '0002_auto_20150616_2121'), ('taggit', '0002_auto_20150616_2121'),
('eo_facture', '0012_client_active'), ('eo_facture', '0012_client_active'),

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0013_contrat_tags'), ('eo_facture', '0013_contrat_tags'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0014_facture_annulation'), ('eo_facture', '0014_facture_annulation'),
] ]

View File

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0015_add_fields_for_periodic_invoicing'), ('eo_facture', '0015_add_fields_for_periodic_invoicing'),
] ]

View File

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0016_auto_20220518_1824'), ('eo_facture', '0016_auto_20220518_1824'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0017_auto_20220518_1827'), ('eo_facture', '0017_auto_20220518_1827'),
] ]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0018_client_notes_privees'), ('eo_facture', '0018_client_notes_privees'),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0019_alter_contrat_client'), ('eo_facture', '0019_alter_contrat_client'),
] ]

View File

@ -6,7 +6,6 @@ import eo_gestion.eo_facture.models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0021_migrate_data_to_accounting_year'), ('eo_facture', '0021_migrate_data_to_accounting_year'),
] ]

View File

@ -34,7 +34,7 @@ from django.db.models.query import QuerySet
from django.db.models.signals import post_delete, post_save from django.db.models.signals import post_delete, post_save
from django.template.loader import get_template from django.template.loader import get_template
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from weasyprint import HTML from weasyprint import HTML
from eo_gestion.utils import percentage_str from eo_gestion.utils import percentage_str

View File

@ -2,13 +2,13 @@
{% load admin_urls i18n %} {% load admin_urls i18n %}
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
<ul class="object-tools"><li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li> <ul class="object-tools"><li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li>
<li><a href="{% url "admin:eo_facture_contrat_changelist" %}?client__id__exact={{ original.id }}">Contrats</a></li> <li><a href="{% url "admin:eo_facture_contrat_changelist" %}?client__id__exact={{ original.id }}">Contrats</a></li>
<li><a href="{% url "admin:eo_facture_facture_changelist" %}?client__id__exact={{ original.id }}">Factures</a></li> <li><a href="{% url "admin:eo_facture_facture_changelist" %}?client__id__exact={{ original.id }}">Factures</a></li>
<li><a href="{% url "admin:eo_facture_facture_add" %}?client={{ original.id }}">Ajouter une facture simple</a></li> <li><a href="{% url "admin:eo_facture_facture_add" %}?client={{ original.id }}">Ajouter une facture simple</a></li>
<li><a href="{% url "admin:eo_facture_contrat_add" %}?tva={{ original.tva|stringformat:".2f" }}&client={{ original.id }}">Ajouter un contrat</a></li> <li><a href="{% url "admin:eo_facture_contrat_add" %}?tva={{ original.tva|stringformat:".2f" }}&client={{ original.id }}">Ajouter un contrat</a></li>
</ul> </ul>
{% endif %}{% endif %} {% endif %}{% endif %}
{% endblock %} {% endblock %}

View File

@ -2,41 +2,41 @@
{% load admin_urls i18n %} {% load admin_urls i18n %}
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
<ul class="object-tools"><li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li> <ul class="object-tools"><li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li>
{% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%} {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
{% if not original.periodicite %} {% if not original.periodicite %}
<li><a href="{% url "admin:eo_facture_contrat_duplicate" original.id %}">Dupliquer</a></li> <li><a href="{% url "admin:eo_facture_contrat_duplicate" original.id %}">Dupliquer</a></li>
{% endif %} {% endif %}
<li><a href="{% url "admin:eo_facture_facture_changelist" %}?contrat={{ original.id }}">Factures</a></li> <li><a href="{% url "admin:eo_facture_facture_changelist" %}?contrat={{ original.id }}">Factures</a></li>
{% if original.has_echeance_to_bill %} {% if original.has_echeance_to_bill %}
<li><a href="javascript:document.getElementById('facturer_echeance_form').submit();">Facturer</a></li> <li><a href="javascript:document.getElementById('facturer_echeance_form').submit();">Facturer</a></li>
<form id="facturer_echeance_form" method="post" action="{% url "admin:eo_facture_contrat_facturer_echeance" original.id %}"> <form id="facturer_echeance_form" method="post" action="{% url "admin:eo_facture_contrat_facturer_echeance" original.id %}">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="echeance" value="{{ original.next_echeance_to_bill }}"/> <input type="hidden" name="echeance" value="{{ original.next_echeance_to_bill }}"/>
</form> </form>
</li> </li>
{% endif %} {% endif %}
{% if not original.periodicite %} {% if not original.periodicite %}
<li><a href="{% url "admin:eo_facture_facture_add" %}?contrat={{ original.id }}&client={{ original.client.id }}&taux_tva={{ original.tva }}">Ajouter une facture</a></li> <li><a href="{% url "admin:eo_facture_facture_add" %}?contrat={{ original.id }}&client={{ original.client.id }}&taux_tva={{ original.tva }}">Ajouter une facture</a></li>
<li><a href="{% url "admin:eo_facture_facture_add_simple" %}?contrat={{ original.id }}">Ajouter une facture comme pourcentage du total</a></li> <li><a href="{% url "admin:eo_facture_facture_add_simple" %}?contrat={{ original.id }}">Ajouter une facture comme pourcentage du total</a></li>
{% endif %} {% endif %}
</ul> </ul>
{% endif %}{% endif %} {% endif %}{% endif %}
{% endblock %} {% endblock %}
{% block after_field_sets %} {% block after_field_sets %}
{% if original.periodicite and original.periodicite_debut %} {% if original.periodicite and original.periodicite_debut %}
<fieldset class="module"> <fieldset class="module">
<h2>Échéances</h2> <h2>Échéances</h2>
<div> <div>
<ul> <ul>
{% for echeance in original.periodicite_echeances %} {% for echeance in original.periodicite_echeances %}
<li>du {{ echeance.1 }} au {{ echeance.2 }}</li> <li>du {{ echeance.1 }} au {{ echeance.2 }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>
</fieldset> </fieldset>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -2,14 +2,14 @@
{% load i18n admin_modify static %} {% load i18n admin_modify static %}
{% block extrahead %}{{ block.super }} {% block extrahead %}{{ block.super }}
{% url "admin:jsi18n" as jsi18nurl %} {% url "admin:jsi18n" as jsi18nurl %}
<script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script> <script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
{{ media }} {{ media }}
{% endblock %} {% endblock %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" type="text/css" href="{% static "css/contrat_duplicate.css" %}" /> <link rel="stylesheet" type="text/css" href="{% static "css/contrat_duplicate.css" %}" />
{% endblock %} {% endblock %}
{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %} {% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
@ -17,30 +17,30 @@
{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
{% block breadcrumbs %}{% if not is_popup %} {% block breadcrumbs %}{% if not is_popup %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="../../../">{% trans "Home" %}</a> &rsaquo; <a href="../../../">{% trans "Home" %}</a> &rsaquo;
<a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo; <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
{% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo; {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo;
<a href="../">{{ contrat }}</a> &rsaquo; <a href="../">{{ contrat }}</a> &rsaquo;
{% trans "Duplication" %} {% trans "Duplication" %}
</div> </div>
{% endif %}{% endblock %} {% endif %}{% endblock %}
{% block content %}<div id="content-main"> {% block content %}<div id="content-main">
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
<div> <div>
{% if errors %} {% if errors %}
<p class="errornote"> <p class="errornote">
{% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
</p> </p>
{{ adminform.form.non_field_errors }} {{ adminform.form.non_field_errors }}
{% endif %} {% endif %}
<table> <table>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
<input type="submit"/> <input type="submit"/>
</div> </div>
</form></div> </form></div>
{% endblock %} {% endblock %}

View File

@ -3,9 +3,9 @@
{% load static %} {% load static %}
{% block extrahead %}{{ block.super }} {% block extrahead %}{{ block.super }}
{% url "admin:jsi18n" as jsi18nurl %} {% url "admin:jsi18n" as jsi18nurl %}
<script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script> <script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
{{ media }} {{ media }}
{% endblock %} {% endblock %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/" %}css/forms.css" />{% endblock %} {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/" %}css/forms.css" />{% endblock %}
@ -15,31 +15,31 @@
{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
{% block breadcrumbs %}{% if not is_popup %} {% block breadcrumbs %}{% if not is_popup %}
<div class="breadcrumbs"> <div class="breadcrumbs">
<a href="../../../">{% trans "Home" %}</a> &rsaquo; <a href="../../../">{% trans "Home" %}</a> &rsaquo;
<a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo; <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
{% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo; {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo;
Rapid' facture Rapid' facture
</div> </div>
{% endif %}{% endblock %} {% endif %}{% endblock %}
{% block content %}<div id="content-main"> {% block content %}<div id="content-main">
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
<div> <div>
{% if errors %} {% if errors %}
<p class="errornote"> <p class="errornote">
{% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
</p> </p>
{{ adminform.form.non_field_errors }} {{ adminform.form.non_field_errors }}
{% endif %} {% endif %}
<table> <table>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
<input type="submit"/> <input type="submit"/>
</div> </div>
</form></div> </form></div>
{% endblock %} {% endblock %}

View File

@ -2,45 +2,45 @@
{% load admin_urls i18n %} {% load admin_urls i18n %}
{% block extrahead %}{{ block.super }} {% block extrahead %}{{ block.super }}
{% if add and not original.client %} {% if add and not original.client %}
{% if not original.contrat or original.contrat.client %} {% if not original.contrat or original.contrat.client %}
<script type="text/javascript"> <script type="text/javascript">
window.addEventListener("load", function(){ window.addEventListener("load", function(){
let client_selector = document.getElementById("id_client"); let client_selector = document.getElementById("id_client");
let client_selector_start_value = client_selector.value; let client_selector_start_value = client_selector.value;
client_selector.onchange = function() { client_selector.onchange = function() {
if (client_selector.value && client_selector.value != client_selector_start_value) { if (client_selector.value && client_selector.value != client_selector_start_value) {
let new_url = window.location.origin + "{% url "admin:eo_facture_facture_add" %}?client=" + client_selector.value; let new_url = window.location.origin + "{% url "admin:eo_facture_facture_add" %}?client=" + client_selector.value;
if (new_url != window.location) { if (new_url != window.location) {
window.location = new_url; window.location = new_url;
} }
} }
}; };
}); });
</script> </script>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block object-tools %} {% block object-tools %}
{% if change %}{% if not is_popup %} {% if change %}{% if not is_popup %}
<ul class="object-tools"> <ul class="object-tools">
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %} {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
<li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li> <li><a href="{{ history_url }}" class="historylink">{% trans "History" %}</a></li>
{% if original.client %} {% if original.client %}
<li><a href="{% url "admin:eo_facture_client_change" original.client.id %}" class="historylink">Client</a></li> <li><a href="{% url "admin:eo_facture_client_change" original.client.id %}" class="historylink">Client</a></li>
{% endif %} {% endif %}
{% if original.contrat %} {% if original.contrat %}
<li><a href="{% url "admin:eo_facture_contrat_change" original.contrat.id %}" class="historylink">Contrat</a></li> <li><a href="{% url "admin:eo_facture_contrat_change" original.contrat.id %}" class="historylink">Contrat</a></li>
{% endif %} {% endif %}
<li><a href="{{history_url}}../view_pdf/{{ original.filename }}">Imprimer</a></li> <li><a href="{{history_url}}../view_pdf/{{ original.filename }}">Imprimer</a></li>
{% if original.client.chorus_structure and not original.proforma %} {% if original.client.chorus_structure and not original.proforma %}
<li><a href="{% url "admin:eo_facture_facture_send_to_chorus" original.id %}">Envoyer à Chorus</a></li> <li><a href="{% url "admin:eo_facture_facture_send_to_chorus" original.id %}">Envoyer à Chorus</a></li>
{% endif %} {% endif %}
{% if not original.annulation and original.factures_avoir.count == 0 %} {% if not original.annulation and original.factures_avoir.count == 0 %}
<li><a href="{% url "admin:eo_facture_facture_cancel" original.id %}">Annuler</a></li> <li><a href="{% url "admin:eo_facture_facture_cancel" original.id %}">Annuler</a></li>
{% endif %} {% endif %}
</ul> </ul>
{% endif %}{% endif %} {% endif %}{% endif %}
{% endblock %} {% endblock %}

View File

@ -10,7 +10,7 @@
</a> </a>
</li> </li>
<li><a href="add_simple/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> <li><a href="add_simple/{% if is_popup %}?_popup=1{% endif %}" class="addlink">
Rapid' facture Rapid' facture
</a> </a>
</li> </li>
<li><a href="sheet/" class="addlink">Export ODS</a></li> <li><a href="sheet/" class="addlink">Export ODS</a></li>

View File

@ -1,29 +1,29 @@
{% load eo_facture %} {% load eo_facture %}
{% if a_facturer %} {% if a_facturer %}
<div class="module" id="a-facturer"> <div class="module" id="a-facturer">
<h2>Reste à facturer</h2> <h2>Reste à facturer</h2>
<p>Liste des contrats qu'on a pas facturés depuis un bon moment et pour lesquels il reste un solde à facturer.</p> <p>Liste des contrats qu'on a pas facturés depuis un bon moment et pour lesquels il reste un solde à facturer.</p>
<p>Montant total: {{ montant|amountformat }} € HT</p> <p>Montant total: {{ montant|amountformat }} € HT</p>
<table class="table"> <table class="table">
<thead> <thead>
<th class="contrat">Contrat</th> <th class="contrat">Contrat</th>
<th class="pourcentage">Pourcentage facturé</th> <th class="pourcentage">Pourcentage facturé</th>
<th class="montant">Reste HT</th> <th class="montant">Reste HT</th>
<th class="derniere-facture">Depuis</th> <th class="derniere-facture">Depuis</th>
</thead> </thead>
<tbody> <tbody>
{% for l in a_facturer %} {% for l in a_facturer %}
<tr> <tr>
<td class="contrat"> <td class="contrat">
<a href="{% url "admin:eo_facture_contrat_change" l.contrat.id %}"> <a href="{% url "admin:eo_facture_contrat_change" l.contrat.id %}">
{{ l.contrat.intitule }} {{ l.contrat.intitule }}
<a/> <a/>
</td> </td>
<td class="pourcentage">{{ l.pourcentage|floatformat:2 }} %</td> <td class="pourcentage">{{ l.pourcentage|floatformat:2 }} %</td>
<td class="montant">{{ l.montant|amountformat }} €</td> <td class="montant">{{ l.montant|amountformat }} €</td>
<td class="derniere-facture">{{ l.depuis }} jours</td> <td class="derniere-facture">{{ l.depuis }} jours</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
{% endif %} {% endif %}

View File

@ -1,45 +1,45 @@
{% load eo_facture %} {% load eo_facture %}
{% if echeances %} {% if echeances %}
<div class="module" id="echeances"> <div class="module" id="echeances">
<h2>Contrats récurrents à facturer</h2> <h2>Contrats récurrents à facturer</h2>
<table id="echeance" class="table"> <table id="echeance" class="table">
<colgroup> <colgroup>
<col class="debut"/> <col class="debut"/>
<col class="client"/> <col class="client"/>
<col class="contrat"/> <col class="contrat"/>
<col class="occurence"/> <col class="occurence"/>
<col class="periodicite"/> <col class="periodicite"/>
</colgroup> </colgroup>
<thead> <thead>
<th class="debut">Date anniversaire</th> <th class="debut">Date anniversaire</th>
<th class="client">Client</th> <th class="client">Client</th>
<th class="contrat">Contrat</th> <th class="contrat">Contrat</th>
<th class="occurence">Échéance</th> <th class="occurence">Échéance</th>
<th class="periodicite">Périodicité</th> <th class="periodicite">Périodicité</th>
<th class="facturer"></th> <th class="facturer"></th>
</thead> </thead>
<tbody> <tbody>
{% for echeance in echeances %} {% for echeance in echeances %}
<tr> <tr>
<td class="debut">{{ echeance.debut|date:"d/m/Y" }} - {{ echeance.fin|date:"d/m/Y" }}</td> <td class="debut">{{ echeance.debut|date:"d/m/Y" }} - {{ echeance.fin|date:"d/m/Y" }}</td>
<td class="client"><a href="{% url "admin:eo_facture_client_change" echeance.contrat.client.id %}">{{ echeance.contrat.client }}</a></td> <td class="client"><a href="{% url "admin:eo_facture_client_change" echeance.contrat.client.id %}">{{ echeance.contrat.client }}</a></td>
<td class="contrat"> <td class="contrat">
<a href="{% url "admin:eo_facture_contrat_change" echeance.contrat.id %}"> <a href="{% url "admin:eo_facture_contrat_change" echeance.contrat.id %}">
{{ echeance.contrat.intitule }} {{ echeance.contrat.intitule }}
</a> </a>
</td> </td>
<td class="occurence">{{ echeance.occurrence }} / {{ echeance.contrat.periodicite_nombre_d_echeances }}</td> <td class="occurence">{{ echeance.occurrence }} / {{ echeance.contrat.periodicite_nombre_d_echeances }}</td>
<td class="periodicite">{{ echeance.contrat.get_periodicite_display }}</td> <td class="periodicite">{{ echeance.contrat.get_periodicite_display }}</td>
<td class="facturer"> <td class="facturer">
<form method="post" action="{% url "admin:eo_facture_contrat_facturer_echeance" echeance.contrat.id %}"> <form method="post" action="{% url "admin:eo_facture_contrat_facturer_echeance" echeance.contrat.id %}">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="echeance" value="{{ echeance.occurrence }}"/> <input type="hidden" name="echeance" value="{{ echeance.occurrence }}"/>
<input type="submit" value="Facturer" style="padding: 2px 3px"/> <input type="submit" value="Facturer" style="padding: 2px 3px"/>
</form> </form>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
{% endif %} {% endif %}

View File

@ -1,35 +1,35 @@
{% load eo_facture %} {% load eo_facture %}
{% if factures %} {% if factures %}
<div class="module" id="impayees"> <div class="module" id="impayees">
<h2>Impayées</h2> <h2>Impayées</h2>
<p>Montant total: {{ montant|amountformat }} € TTC ({{montant_ht|amountformat}} € HT) </p> <p>Montant total: {{ montant|amountformat }} € TTC ({{montant_ht|amountformat}} € HT) </p>
<table id="impayee"> <table id="impayee">
<thead> <thead>
<th>Quoi?</th> <th>Quoi?</th>
<th>Depuis...</th> <th>Depuis...</th>
</thead> </thead>
<tbody> <tbody>
{% for l in factures %} {% for l in factures %}
{% with l.facture as facture %} {% with l.facture as facture %}
<tr class="facture{% if l.encaissements %} encaissement{% endif %}{% if l.vieille %} vieille{% endif %}"><td> <tr class="facture{% if l.encaissements %} encaissement{% endif %}{% if l.vieille %} vieille{% endif %}"><td>
<div class="facture"><a href="{% url "admin:eo_facture_facture_change" facture.pk_or_code %}">{{ facture.code }} - {{facture.intitule}}<a/> pour {{ facture.solde|amountformat }} {{ facture.contrat.client.monnaie }} TTC à <a href="{% url "admin:eo_facture_client_change" facture.client.id %}">{{facture.client}}</a></div> <div class="facture"><a href="{% url "admin:eo_facture_facture_change" facture.pk_or_code %}">{{ facture.code }} - {{facture.intitule}}<a/> pour {{ facture.solde|amountformat }} {{ facture.contrat.client.monnaie }} TTC à <a href="{% url "admin:eo_facture_client_change" facture.client.id %}">{{facture.client}}</a></div>
</td> </td>
<td>{{facture.emission|ago}}</td> <td>{{facture.emission|ago}}</td>
</tr> </tr>
{% if l.encaissements %} {% if l.encaissements %}
{% for encaissement in l.encaissements %} {% for encaissement in l.encaissements %}
<tr class="encaissements"> <tr class="encaissements">
<td border="0"> <td border="0">
<a href="{% url "admin:eo_banque_lignebanquepop_change" encaissement.id%}">{{ encaissement.libelle }} - {{ encaissement.reference }} - payé le {{ encaissement.date_valeur }}</a> de {{ encaissement.montant|amountformat }} €</td> <a href="{% url "admin:eo_banque_lignebanquepop_change" encaissement.id%}">{{ encaissement.libelle }} - {{ encaissement.reference }} - payé le {{ encaissement.date_valeur }}</a> de {{ encaissement.montant|amountformat }} €</td>
<td> <td>
<a href="{% url "admin:eo_facture_payment_add" %}?facture={{ facture.id }}&ligne_banque_pop={{ encaissement.id }}&montant_affecte={{ encaissement.montant|stringformat:".2f" }}">Accepter</a> <a href="{% url "admin:eo_facture_payment_add" %}?facture={{ facture.id }}&ligne_banque_pop={{ encaissement.id }}&montant_affecte={{ encaissement.montant|stringformat:".2f" }}">Accepter</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
{% endwith %} {% endwith %}
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div> </div>
{% endif %} {% endif %}

View File

@ -1,47 +1,47 @@
{% load eo_facture %} {% load eo_facture %}
<div class="module" id="income"> <div class="module" id="income">
<table id="income-table" class="table"> <table id="income-table" class="table">
<caption>Chiffre d'affaire par an</caption> <caption>Chiffre d'affaire par an</caption>
<thead> <thead>
<tr> <tr>
<th>Année</th> <th>Année</th>
{% for i in income_by_year %} {% for i in income_by_year %}
<th>{{ i.year }}</th> <th>{{ i.year }}</th>
{% endfor %} {% endfor %}
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td>Encaissé</td> <td>Encaissé</td>
{% for i in income_by_year %} {% for i in income_by_year %}
<td>{{ i.paid|amountformat }}</td> <td>{{ i.paid|amountformat }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
<tr> <tr>
<td>Facturé</td> <td>Facturé</td>
{% for i in income_by_year %} {% for i in income_by_year %}
<td>{{ i.invoiced|amountformat }}</td> <td>{{ i.invoiced|amountformat }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
<tr> <tr>
<td>Contracté</td> <td>Contracté</td>
{% for i in income_by_year %} {% for i in income_by_year %}
<td>{{ i.contracted|amountformat }}</td> <td>{{ i.contracted|amountformat }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
<tr> <tr>
<td>Sous-traité</td> <td>Sous-traité</td>
{% for i in income_by_year %} {% for i in income_by_year %}
<td>{{ i.sous_traite|amountformat }}</td> <td>{{ i.sous_traite|amountformat }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
<tr> <tr>
<td>Total</td> <td>Total</td>
{% for i in income_by_year %} {% for i in income_by_year %}
<td>{{ i.total|amountformat }}</td> <td>{{ i.total|amountformat }}</td>
{% endfor %} {% endfor %}
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -1,31 +1,31 @@
{% load eo_facture %} {% load eo_facture %}
<div class="module" id="module-table-{{name}}"> <div class="module" id="module-table-{{name}}">
<table id="table-{{name}}" class="table"> <table id="table-{{name}}" class="table">
<caption>{{title}}</caption> <caption>{{title}}</caption>
<!-- headers --> <!-- headers -->
<thead> <thead>
{% for header, header_title in headers %} {% for header, header_title in headers %}
<th class="header-{{header}}">{{header_title}}</th> <th class="header-{{header}}">{{header_title}}</th>
{% endfor %} {% endfor %}
</thead> </thead>
<tbody> <tbody>
{% for row in table %} {% for row in table %}
<tr> <tr>
{% if row.0.href %} {% if row.0.href %}
<td><a href="{{ row.0.href }}">{{ row.0 }}</a></td> <td><a href="{{ row.0.href }}">{{ row.0 }}</a></td>
{% else %} {% else %}
<td>{{ row.0 }}</td> <td>{{ row.0 }}</td>
{% endif %} {% endif %}
<td class="number-cell">{{ row.1|amountformat }}</td> <td class="number-cell">{{ row.1|amountformat }}</td>
<td class="number-cell">{{ row.2|amountformat }}</td> <td class="number-cell">{{ row.2|amountformat }}</td>
<td class="number-cell">{{ row.3|floatformat:2 }} %</td> <td class="number-cell">{{ row.3|floatformat:2 }} %</td>
<td class="number-cell">{{ row.4|amountformat }}</td> <td class="number-cell">{{ row.4|amountformat }}</td>
<td class="number-cell">{{ row.5|floatformat:2 }} %</td> <td class="number-cell">{{ row.5|floatformat:2 }} %</td>
<td class="number-cell">{{ row.6|floatformat:2 }} %</td> <td class="number-cell">{{ row.6|floatformat:2 }} %</td>
<td class="number-cell">{{ row.7|floatformat:2 }}</td> <td class="number-cell">{{ row.7|floatformat:2 }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</thead> </thead>
</table> </table>
</div> </div>

View File

@ -1,81 +1,81 @@
{% load eo_facture %} {% load eo_facture %}
<html> <html>
<head> <head>
{% if base_uri %}<base href="{{base_uri}}">{% endif %} {% if base_uri %}<base href="{{base_uri}}">{% endif %}
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Facture {{facture.code}} - {{facture.intitule}}</title> <title>Facture {{facture.code}} - {{facture.intitule}}</title>
<meta name="author" content="Entr'ouvert"> <meta name="author" content="Entr'ouvert">
<link href="/static/css/facture.css" media="print" rel="stylesheet"> <link href="/static/css/facture.css" media="print" rel="stylesheet">
</head> </head>
<body> <body>
<div id="date"><table><tr id="code">{% if facture.proforma %}<td class="col1">Devis</td><td class="col2">n°{{ facture.id }}</td>{% else %} <div id="date"><table><tr id="code">{% if facture.proforma %}<td class="col1">Devis</td><td class="col2">n°{{ facture.id }}</td>{% else %}
<td class="col1">Facture</td><td class="col2">{{facture.code}}</td>{% endif %}</tr> <td class="col1">Facture</td><td class="col2">{{facture.code}}</td>{% endif %}</tr>
{% if facture.annulation %} {% if facture.annulation %}
<tr id="code"> <tr id="code">
<td class="col1">Annule</td> <td class="col1">Annule</td>
<td class="col2">{% if facture.annulation.proforma %}devis n°{{facture.annulation.id}}{% else %}{{ facture.annulation.code }}{% endif %}</td> <td class="col2">{% if facture.annulation.proforma %}devis n°{{facture.annulation.id}}{% else %}{{ facture.annulation.code }}{% endif %}</td>
</tr> </tr>
{% endif %} {% endif %}
<tr><td class="col1">Date</td><td class="col2">{{ facture.emission|date:'d/m/Y' }}</td></tr> <tr><td class="col1">Date</td><td class="col2">{{ facture.emission|date:'d/m/Y' }}</td></tr>
<tr><td class="col1">{% if facture.proforma %}Valable jusqu'au{% else %}Échéance{% endif %}</td><td class="col2">{{ facture.echeance|date:'d/m/Y' }}</td></tr></table></div> <tr><td class="col1">{% if facture.proforma %}Valable jusqu'au{% else %}Échéance{% endif %}</td><td class="col2">{{ facture.echeance|date:'d/m/Y' }}</td></tr></table></div>
<div id="from"><img id="logo-eo" src="/static/img/logo.png" width="160"/><div id="info"> <div id="from"><img id="logo-eo" src="/static/img/logo.png" width="160"/><div id="info">
Société Coopérative et Participative Société Coopérative et Participative
SARL au capital variable de 15200 € SARL au capital variable de 15200 €
169 rue du château 169 rue du château
75014 PARIS 75014 PARIS
FRANCE FRANCE
Tél : 01 43 35 01 35 Tél : 01 43 35 01 35
Email : gerant@entrouvert.com Email : gerant@entrouvert.com
Web : https://www.entrouvert.com Web : https://www.entrouvert.com
RCS : Paris RCS : Paris
NAF/APE : 6201Z NAF/APE : 6201Z
SIRET : 443 170 139 00036 SIRET : 443 170 139 00036
Numéro TVA : FR 08443170139</div></div> Numéro TVA : FR 08443170139</div></div>
<div id="to"><strong>{{ facture.client.nom }}</strong></br> <div id="to"><strong>{{ facture.client.nom }}</strong></br>
{{ facture.client.adresse|linebreaksbr }} {{ facture.client.adresse|linebreaksbr }}
</div> </div>
<div id="main"> <div id="main">
<div id="intitule"><h1>{{ facture.intitule }}</h1></div> <div id="intitule"><h1>{{ facture.intitule }}</h1></div>
<div id="notes"><p style="white-space: pre-line">{{ facture.notes }}</p></div> <div id="notes"><p style="white-space: pre-line">{{ facture.notes }}</p></div>
<table id="lignes"> <table id="lignes">
<thead><tr><td class="description">Description</td><td class="number">Quantité</td><td class="number" id="unitaire">Prix unitaire</td><td class="number">Prix HT</td></tr></thead> <thead><tr><td class="description">Description</td><td class="number">Quantité</td><td class="number" id="unitaire">Prix unitaire</td><td class="number">Prix HT</td></tr></thead>
<tbody> <tbody>
{% for ligne in facture.lignes.all %} {% for ligne in facture.lignes.all %}
<tr> <tr>
<td class="description">{{ ligne.intitule }}</td> <td class="description">{{ ligne.intitule }}</td>
<td class="number">{{ ligne.quantite|floatformat:2 }}</td> <td class="number">{{ ligne.quantite|floatformat:2 }}</td>
<td class="number">{{ ligne.prix_unitaire_ht|amountformat }}</td> <td class="number">{{ ligne.prix_unitaire_ht|amountformat }}</td>
<td class="number">{{ ligne.montant|amountformat }}</td> <td class="number">{{ ligne.montant|amountformat }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
<tfoot> <tfoot>
<tr><td colspan="3" class="total">Sous-total :</td><td class="number">{{ facture.montant|amountformat }}</td></tr> <tr><td colspan="3" class="total">Sous-total :</td><td class="number">{{ facture.montant|amountformat }}</td></tr>
<tr><td colspan="3" class="total">Total TVA (à {{facture.taux_tva|floatformat:2 }} %) :</td><td class="number">{{ facture.tva|amountformat }}</td></tr> <tr><td colspan="3" class="total">Total TVA (à {{facture.taux_tva|floatformat:2 }} %) :</td><td class="number">{{ facture.tva|amountformat }}</td></tr>
<tr><td colspan="3" class="total">Total TTC :</td><td class="number">{{ facture.montant_ttc|amountformat }}</td></tr> <tr><td colspan="3" class="total">Total TTC :</td><td class="number">{{ facture.montant_ttc|amountformat }}</td></tr>
</tfoot> </tfoot>
</table> </table>
<p>Paiement total de {{ facture.montant_ttc|amountformat }} {{ facture.contrat.client.monnaie }} à verser au nom d'Entr'ouvert.</p> <p>Paiement total de {{ facture.montant_ttc|amountformat }} {{ facture.contrat.client.monnaie }} à verser au nom d'Entr'ouvert.</p>
<p>Mode de paiement : virement</p> <p>Mode de paiement : virement</p>
</div> </div>
<div id="footer"> <div id="footer">
<div id="rib">Domiciliation bancaire : BP RIVES MAINE <div id="rib">Domiciliation bancaire : BP RIVES MAINE
BIC : CCBPFRPPMTG BIC : CCBPFRPPMTG
IBAN : FR76 1020 7000 9104 0910 0252 059 IBAN : FR76 1020 7000 9104 0910 0252 059
Code étab. : 10207 Code guichet : 00091 Numéro de compte : 04091002520 Clé RIB : 59</div> Code étab. : 10207 Code guichet : 00091 Numéro de compte : 04091002520 Clé RIB : 59</div>
<div id="le">Entr'ouvert est membre du <div id="le">Entr'ouvert est membre du
<img src="/static/img/logo-le-black.png" width="70"/> <img src="/static/img/logo-le-black.png" width="70"/>
</div> </div>
<div id="echeance">Passée la date d'échéance ci-dessus, une pénalité de retard <div id="echeance">Passée la date d'échéance ci-dessus, une pénalité de retard
sera calculée au taux de 1,5 % par mois conformément à nos conditions sera calculée au taux de 1,5 % par mois conformément à nos conditions
générales de vente, voir générales de vente, voir
<a href="https://www.entrouvert.com/fr/conditions-generales-de-vente/">https://www.entrouvert.com/fr/conditions-generales-de-vente/</a></div> <a href="https://www.entrouvert.com/fr/conditions-generales-de-vente/">https://www.entrouvert.com/fr/conditions-generales-de-vente/</a></div>
</div> </div>
</div> </div>
</body> </body>
</html> </html>

View File

@ -1,7 +1,7 @@
{% load gadjo %}{% include "django/forms/widgets/select.html" %} {% load gadjo %}{% include "django/forms/widgets/select.html" %}
<script> <script>
jQuery(document).ready(function () { jQuery(document).ready(function () {
$('#{{ widget.attrs.id }}').select2({tags: true}); $('#{{ widget.attrs.id }}').select2({tags: true});
}) })
</script> </script>

View File

@ -180,7 +180,6 @@ def income_by_clients(user=None, year=None):
for contrat in contrats.select_related('client').prefetch_related( for contrat in contrats.select_related('client').prefetch_related(
'factures', 'factures__lignes', 'prestations' 'factures', 'factures__lignes', 'prestations'
): ):
# how much as already been invoiced before previsions # how much as already been invoiced before previsions
adjust = 0 adjust = 0
invoiced = 0 invoiced = 0

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
def validate_luhn(string_value, length=None): def validate_luhn(string_value, length=None):

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [

View File

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('eo_facture', '0019_alter_contrat_client'), ('eo_facture', '0019_alter_contrat_client'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),

View File

@ -19,7 +19,7 @@ import xml.etree.ElementTree as ET
import zipfile import zipfile
from datetime import date, datetime from datetime import date, datetime
from django.utils.encoding import force_text from django.utils.encoding import force_str
NS = { NS = {
'fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0', 'fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
@ -188,7 +188,7 @@ class WorkCell:
value = '' value = ''
self.worksheet = worksheet self.worksheet = worksheet
self.native_value = value self.native_value = value
value = force_text(value) value = force_str(value)
for i in range(0x20): # remove control characters for i in range(0x20): # remove control characters
char = chr(i) char = chr(i)
if char in ('\t', '\r', '\n'): if char in ('\t', '\r', '\n'):

View File

@ -29,7 +29,7 @@ ALLOWED_HOSTS = ['*']
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ENGINE': 'django.db.backends.postgresql',
'NAME': 'barbacompta', 'NAME': 'barbacompta',
'USER': '', # Not used with sqlite3. 'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3.

View File

@ -5,8 +5,8 @@
{% block content %} {% block content %}
<h2>{% trans "Error: page not found" %}</h2> <h2>{% trans "Error: page not found" %}</h2>
<p>{% trans "The page you requested has not been found on this server." %} <p>{% trans "The page you requested has not been found on this server." %}
{% endblock %} {% endblock %}

View File

@ -5,8 +5,8 @@
{% block content %} {% block content %}
<h2>{% trans "Server Error" %}</h2> <h2>{% trans "Server Error" %}</h2>
<p>{% trans "We're sorry but a server error has occurred." %} <p>{% trans "We're sorry but a server error has occurred." %}
{% endblock %} {% endblock %}

View File

@ -4,28 +4,28 @@
{% block title %}{{ title }} | {% trans "Entr'ouvert Gestion" %}{% endblock %} {% block title %}{{ title }} | {% trans "Entr'ouvert Gestion" %}{% endblock %}
{% block branding %} {% block branding %}
<h1 id="site-name">{% trans "Entr'ouvert Gestion" %}</h1> <h1 id="site-name">{% trans "Entr'ouvert Gestion" %}</h1>
{% endblock %} {% endblock %}
{% block extrastyle %} {% block extrastyle %}
{{ block.super }} {{ block.super }}
<meta charset="utf-8"><!----> <meta charset="utf-8"><!---->
<link rel="stylesheet" type="text/css" href="{% static "css/admin_gestion.css" %}"/> <link rel="stylesheet" type="text/css" href="{% static "css/admin_gestion.css" %}"/>
{% endblock %} {% endblock %}
{% block content_title %}<h1>Gestion de la facturation et des finances</h1>{% endblock %} {% block content_title %}<h1>Gestion de la facturation et des finances</h1>{% endblock %}
{% block nav-global %} {% block nav-global %}
<ul class="menu"> <ul class="menu">
<li><a href="{% url "admin:eo_facture_facture_changelist"%}?emission__year={% now "Y" %}">Factures {% now "Y" %}</a></li> <li><a href="{% url "admin:eo_facture_facture_changelist"%}?emission__year={% now "Y" %}">Factures {% now "Y" %}</a></li>
<li><a href="{% url "admin:eo_facture_client_changelist" %}">Clients</a></li> <li><a href="{% url "admin:eo_facture_client_changelist" %}">Clients</a></li>
<li><a href="{% url "admin:eo_facture_client_add" %}">Ajouter un client</a></li> <li><a href="{% url "admin:eo_facture_client_add" %}">Ajouter un client</a></li>
<li><a href="{% url "admin:eo_facture_contrat_changelist" %}">Contrats</a></li> <li><a href="{% url "admin:eo_facture_contrat_changelist" %}">Contrats</a></li>
<li><a href="{% url "admin:eo_facture_contrat_add" %}">Ajouter un contrat</a></li> <li><a href="{% url "admin:eo_facture_contrat_add" %}">Ajouter un contrat</a></li>
<li><a href="{% url "admin:eo_banque_lignebanquepop_changelist" %}">Compte en banque</a></li> <li><a href="{% url "admin:eo_banque_lignebanquepop_changelist" %}">Compte en banque</a></li>
</ul> </ul>
{% endblock %} {% endblock %}
{% block userlinks %} {% block userlinks %}
<a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a> <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
{% endblock %} {% endblock %}

View File

@ -2,12 +2,12 @@
{% load i18n %} {% load i18n %}
{% load eo_banque %} {% load eo_banque %}
{% block date_hierarchy %} {% block date_hierarchy %}
{{ block.super }} {{ block.super }}
{% eo_banque_date_hierarchy cl %} {% eo_banque_date_hierarchy cl %}
{% endblock %} {% endblock %}
{% block pagination %} {% block pagination %}
{% total %} {% total %}
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}
{% block object-tools %} {% block object-tools %}
{% endblock %} {% endblock %}

View File

@ -5,25 +5,25 @@
{% block content %} {% block content %}
<div id="content-main"> <div id="content-main">
{% echeances %} {% echeances %}
{% if 'cpf' in request.GET %} {% if 'cpf' in request.GET %}
<a href="?">Afficher tout le monde</a><br /> <a href="?">Afficher tout le monde</a><br />
{% if request.GET.cpf == 'True' %} {% if request.GET.cpf == 'True' %}
{% income_by_clients user %} {% income_by_clients user %}
{% else %} {% else %}
{% income_by_clients %} {% income_by_clients %}
{% endif %}
{% else %}
<a href="?cpf=True">N'afficher que mes clients</a><br />
{% income_by_clients %}
{% endif %} {% endif %}
{% else %} {% impayees %}
<a href="?cpf=True">N'afficher que mes clients</a><br /> {% a_facturer %}
{% income_by_clients %} {% finances 8 %}
{% endif %} </div>
{% impayees %}
{% a_facturer %}
{% finances 8 %}
</div>
{% endblock %} {% endblock %}
{% block sidebar_module %} {% block sidebar_module %}
{% income %} {% income %}
{% endblock %} {% endblock %}

View File

@ -11,72 +11,72 @@
{% block breadcrumbs %}{% endblock %} {% block breadcrumbs %}{% endblock %}
{% block content %} {% block content %}
<div id="content-main"> <div id="content-main">
{% if app_list %} {% if app_list %}
{% for app in app_list %} {% for app in app_list %}
<div class="module"> <div class="module">
<table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}"> <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
<caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption> <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>
{% for model in app.models %} {% for model in app.models %}
<tr> <tr>
{% if model.perms.change %} {% if model.perms.change %}
<th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th> <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
{% else %} {% else %}
<th scope="row">{{ model.name }}</th> <th scope="row">{{ model.name }}</th>
{% endif %} {% endif %}
{% if model.perms.add %} {% if model.perms.add %}
<td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td> <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
{% else %} {% else %}
<td>&nbsp;</td> <td>&nbsp;</td>
{% endif %} {% endif %}
{% if model.perms.change %} {% if model.perms.change %}
<td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td> <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
{% else %} {% else %}
<td>&nbsp;</td> <td>&nbsp;</td>
{% endif %} {% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
</div> </div>
{% endfor %} {% endfor %}
{% else %} {% else %}
<p>{% trans "You don't have permission to edit anything." %}</p> <p>{% trans "You don't have permission to edit anything." %}</p>
{% endif %} {% endif %}
</div> </div>
{% endblock %} {% endblock %}
{% block sidebar %} {% block sidebar %}
<div id="content-related"> <div id="content-related">
{% block sidebar_module %}{% endblock %} {% block sidebar_module %}{% endblock %}
<div class="module" id="recent-actions-module"> <div class="module" id="recent-actions-module">
<h2>{% trans 'Recent Actions' %}</h2> <h2>{% trans 'Recent Actions' %}</h2>
<h3>{% trans 'My Actions' %}</h3> <h3>{% trans 'My Actions' %}</h3>
{% load log %} {% load log %}
{% get_admin_log 10 as admin_log for_user user %} {% get_admin_log 10 as admin_log for_user user %}
{% if not admin_log %} {% if not admin_log %}
<p>{% trans 'None available' %}</p> <p>{% trans 'None available' %}</p>
{% else %} {% else %}
<ul class="actionlist"> <ul class="actionlist">
{% for entry in admin_log %} {% for entry in admin_log %}
<li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}"> <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">
{% if entry.is_deletion %} {% if entry.is_deletion %}
{{ entry.object_repr }} {{ entry.object_repr }}
{% else %} {% else %}
<a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a> <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
{% endif %} {% endif %}
<br/> <br/>
{% if entry.content_type %} {% if entry.content_type %}
<span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span> <span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span>
{% else %} {% else %}
<span class="mini quiet">{% trans 'Unknown content' %}</span> <span class="mini quiet">{% trans 'Unknown content' %}</span>
{% endif %} {% endif %}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -17,7 +17,7 @@
import django.contrib.admin import django.contrib.admin
from django.conf import settings from django.conf import settings
from django.conf.urls import include, url from django.urls import include, path, re_path
from django.views.generic.base import RedirectView from django.views.generic.base import RedirectView
from . import admin from . import admin
@ -26,12 +26,12 @@ from .eo_facture.views import api_references
django.contrib.admin.autodiscover() django.contrib.admin.autodiscover()
urlpatterns = [ urlpatterns = [
url(r'^favicon.ico', RedirectView.as_view(), {'url': '/static/img/favicon.ico'}), re_path(r'^favicon.ico', RedirectView.as_view(), {'url': '/static/img/favicon.ico'}),
url(r'^api/references/$', api_references), path('api/references/', api_references),
url(r'^', admin.site.urls), re_path(r'^', admin.site.urls),
] ]
if 'mellon' in settings.INSTALLED_APPS: if 'mellon' in settings.INSTALLED_APPS:
urlpatterns = [ urlpatterns = [
url(r'^accounts/mellon/', include('mellon.urls')), path('accounts/mellon/', include('mellon.urls')),
] + urlpatterns ] + urlpatterns

View File

@ -253,31 +253,26 @@ class SortableAdminMixin(SortableAdminBase):
setattr(obj, self.default_order_field, self.get_max_order(request, obj) + 1) setattr(obj, self.default_order_field, self.get_max_order(request, obj) + 1)
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
@admin.action(description=_('Move selected to specific page'))
def move_to_exact_page(self, request, queryset): def move_to_exact_page(self, request, queryset):
self._bulk_move(request, queryset, self.EXACT) self._bulk_move(request, queryset, self.EXACT)
move_to_exact_page.short_description = _('Move selected to specific page') @admin.action(description=_('Move selected ... pages back'))
def move_to_back_page(self, request, queryset): def move_to_back_page(self, request, queryset):
self._bulk_move(request, queryset, self.BACK) self._bulk_move(request, queryset, self.BACK)
move_to_back_page.short_description = _('Move selected ... pages back') @admin.action(description=_('Move selected ... pages forward'))
def move_to_forward_page(self, request, queryset): def move_to_forward_page(self, request, queryset):
self._bulk_move(request, queryset, self.FORWARD) self._bulk_move(request, queryset, self.FORWARD)
move_to_forward_page.short_description = _('Move selected ... pages forward') @admin.action(description=_('Move selected to first page'))
def move_to_first_page(self, request, queryset): def move_to_first_page(self, request, queryset):
self._bulk_move(request, queryset, self.FIRST) self._bulk_move(request, queryset, self.FIRST)
move_to_first_page.short_description = _('Move selected to first page') @admin.action(description=_('Move selected to last page'))
def move_to_last_page(self, request, queryset): def move_to_last_page(self, request, queryset):
self._bulk_move(request, queryset, self.LAST) self._bulk_move(request, queryset, self.LAST)
move_to_last_page.short_description = _('Move selected to last page')
def _move_item(self, request, startorder, endorder): def _move_item(self, request, startorder, endorder):
extra_model_filters = self.get_extra_model_filters(request) extra_model_filters = self.get_extra_model_filters(request)
return self.move_item(startorder, endorder, extra_model_filters) return self.move_item(startorder, endorder, extra_model_filters)
@ -312,7 +307,6 @@ class SortableAdminMixin(SortableAdminBase):
try: try:
obj = model.objects.get(**obj_filters) obj = model.objects.get(**obj_filters)
except model.MultipleObjectsReturned: except model.MultipleObjectsReturned:
# noinspection PyProtectedMember # noinspection PyProtectedMember
raise model.MultipleObjectsReturned( raise model.MultipleObjectsReturned(
"Detected non-unique values in field '{rank_field}' used for sorting this model.\n" "Detected non-unique values in field '{rank_field}' used for sorting this model.\n"

View File

@ -1,13 +1,13 @@
{% extends "admin/change_list.html" %} {% extends "admin/change_list.html" %}
{% block extrahead %} {% block extrahead %}
{{ block.super }} {{ block.super }}
<script type="application/json" id="admin_sortable2_config"> <script type="application/json" id="admin_sortable2_config">
{ {
"default_order_direction": "{{ default_order_direction }}", "default_order_direction": "{{ default_order_direction }}",
"update_url": "{{ sortable_update_url }}", "update_url": "{{ sortable_update_url }}",
"current_page": {{ cl.page_num | add:'1' }}, "current_page": {{ cl.page_num | add:'1' }},
"total_pages": {{ cl.paginator.num_pages }} "total_pages": {{ cl.paginator.num_pages }}
} }
</script> </script>
{% endblock %} {% endblock %}

View File

@ -1,32 +1,32 @@
<fieldset class="module aligned {{ fieldset.classes }}"> <fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %} {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %} {% if fieldset.description %}
<div class="description">{{ fieldset.description|safe }}</div> <div class="description">{{ fieldset.description|safe }}</div>
{% endif %} {% endif %}
{% for line in fieldset %} {% for line in fieldset %}
{# Its an ugly hack to hide hidden input fields using style "display: none;", but unless https://code.djangoproject.com/ticket/11277 is solved, it currently the only possible workaround #} {# Its an ugly hack to hide hidden input fields using style "display: none;", but unless https://code.djangoproject.com/ticket/11277 is solved, it currently the only possible workaround #}
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if field.field.is_hidden %} is_hidden{% endif %}{% endfor %}"> <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if field.field.is_hidden %} is_hidden{% endif %}{% endfor %}">
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %} {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
{% for field in line %} {% for field in line %}
{% if field.field.is_hidden %}{{ field.field }}{% else %} {% if field.field.is_hidden %}{{ field.field }}{% else %}
<div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}> <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %} {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
{% if field.is_checkbox %} {% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }} {{ field.field }}{{ field.label_tag }}
{% else %} {% else %}
{{ field.label_tag }} {{ field.label_tag }}
{% if field.is_readonly %} {% if field.is_readonly %}
<p>{{ field.contents|linebreaksbr }}</p> <p>{{ field.contents|linebreaksbr }}</p>
{% else %} {% else %}
{{ field.field }} {{ field.field }}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if field.field.help_text %} {% if field.field.help_text %}
<p class="help">{{ field.field.help_text|safe }}</p> <p class="help">{{ field.field.help_text|safe }}</p>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</div> </div>
{% endfor %} {% endfor %}
</fieldset> </fieldset>

View File

@ -1,31 +1,31 @@
{% load i18n admin_urls static %} {% load i18n admin_urls static %}
<div class="inline-group sortable" id="{{ inline_admin_formset.formset.prefix }}-group"> <div class="inline-group sortable" id="{{ inline_admin_formset.formset.prefix }}-group">
<fieldset class="module {{ inline_admin_formset.classes }}"> <fieldset class="module {{ inline_admin_formset.classes }}">
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2> <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{{ inline_admin_formset.formset.management_form }} {{ inline_admin_formset.formset.management_form }}
{{ inline_admin_formset.formset.non_form_errors }} {{ inline_admin_formset.formset.non_form_errors }}
{% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> {% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %} <h3><b>{{ inline_admin_formset.opts.verbose_name|capfirst }}:</b>&nbsp;<span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %} <a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %}
{% else %}#{{ forloop.counter }}{% endif %}</span> {% else %}#{{ forloop.counter }}{% endif %}</span>
{% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %} {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %}
{% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %} {% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %}
</h3> </h3>
{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} {% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}
{% for fieldset in inline_admin_form %} {% for fieldset in inline_admin_form %}
{% include "adminsortable2/includes/fieldset.html" %} {% include "adminsortable2/includes/fieldset.html" %}
{% endfor %} {% endfor %}
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{{ inline_admin_form.fk_field.field }} {{ inline_admin_form.fk_field.field }}
</div>{% endfor %} </div>{% endfor %}
</fieldset> </fieldset>
</div> </div>
<script type="application/json" class="inline-stacked-config"> <script type="application/json" class="inline-stacked-config">
{ {
"prefix": "{{ inline_admin_formset.formset.prefix|escapejs }}", "prefix": "{{ inline_admin_formset.formset.prefix|escapejs }}",
"deleteText": "{% filter escapejs %}{% trans "Remove" %}{% endfilter %}", "deleteText": "{% filter escapejs %}{% trans "Remove" %}{% endfilter %}",
"addText": "{% filter escapejs %}{% blocktrans with verbose_name=inline_admin_formset.opts.verbose_name|capfirst %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}" "addText": "{% filter escapejs %}{% blocktrans with verbose_name=inline_admin_formset.opts.verbose_name|capfirst %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}"
} }
</script> </script>
<div class="default_order_field" default_order_field="{{ inline_admin_formset.formset.default_order_field }}" default_order_direction="{{ inline_admin_formset.formset.default_order_direction }}"></div> <div class="default_order_field" default_order_field="{{ inline_admin_formset.formset.default_order_field }}" default_order_direction="{{ inline_admin_formset.formset.default_order_direction }}"></div>

View File

@ -1,82 +1,82 @@
{% load i18n admin_urls static admin_modify %} {% load i18n admin_urls static admin_modify %}
<div class="inline-group sortable" id="{{ inline_admin_formset.formset.prefix }}-group"> <div class="inline-group sortable" id="{{ inline_admin_formset.formset.prefix }}-group">
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}"> <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
{{ inline_admin_formset.formset.management_form }} {{ inline_admin_formset.formset.management_form }}
<fieldset class="module {{ inline_admin_formset.classes }}"> <fieldset class="module {{ inline_admin_formset.classes }}">
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2> <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
{{ inline_admin_formset.formset.non_form_errors }} {{ inline_admin_formset.formset.non_form_errors }}
<table> <table>
<thead><tr><th>{% trans "Sort" %}</th> <thead><tr><th>{% trans "Sort" %}</th>
{% for field in inline_admin_formset.fields %} {% for field in inline_admin_formset.fields %}
{% if not field.widget.is_hidden %} {% if not field.widget.is_hidden %}
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }} <th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
{% if field.help_text %}&nbsp;<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}" />{% endif %} {% if field.help_text %}&nbsp;<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}" />{% endif %}
</th> </th>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %} {% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
</tr></thead> </tr></thead>
<tbody> <tbody>
{% for inline_admin_form in inline_admin_formset %} {% for inline_admin_form in inline_admin_formset %}
{% if inline_admin_form.form.non_field_errors %} {% if inline_admin_form.form.non_field_errors %}
<tr><td colspan="{{ inline_admin_form|cell_count|add:1 }}">{{ inline_admin_form.form.non_field_errors }}</td></tr> <tr><td colspan="{{ inline_admin_form|cell_count|add:1 }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
{% endif %} {% endif %}
<tr class="form-row {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}" <tr class="form-row {% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}"
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
<td class="drag">&nbsp;</td> <td class="drag">&nbsp;</td>
<td class="original"> <td class="original">
{% if inline_admin_form.original or inline_admin_form.show_url %}<p> {% if inline_admin_form.original or inline_admin_form.show_url %}<p>
{% if inline_admin_form.original %} {% if inline_admin_form.original %}
{{ inline_admin_form.original }} {{ inline_admin_form.original }}
{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %} {% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}" class="inlinechangelink">{% trans "Change" %}</a>{% endif %}
{% endif %} {% endif %}
{% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %} {% if inline_admin_form.show_url %}<a href="{{ inline_admin_form.absolute_url }}">{% trans "View on site" %}</a>{% endif %}
</p>{% endif %} </p>{% endif %}
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %} {% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
{{ inline_admin_form.fk_field.field }} {{ inline_admin_form.fk_field.field }}
{% spaceless %} {% spaceless %}
{% for fieldset in inline_admin_form %} {% for fieldset in inline_admin_form %}
{% for line in fieldset %} {% for line in fieldset %}
{% for field in line %} {% for field in line %}
{% if field.field.is_hidden %} {{ field.field }} {% endif %} {% if field.field.is_hidden %} {{ field.field }} {% endif %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
{% endspaceless %} {% endspaceless %}
</td>
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if not field.field.is_hidden %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{{ field.field.errors.as_ul }}
{{ field.field }}
{% endif %}
</td> </td>
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if not field.field.is_hidden %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{{ field.field.errors.as_ul }}
{{ field.field }}
{% endif %}
</td>
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
{% if inline_admin_formset.formset.can_delete %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% endif %} {% endif %}
{% endfor %} </tr>
{% endfor %} {% endfor %}
{% endfor %} </tbody>
{% if inline_admin_formset.formset.can_delete %} </table>
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td> </fieldset>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</fieldset>
</div> </div>
</div> </div>
<script type="application/json" class="inline-tabular-config"> <script type="application/json" class="inline-tabular-config">
{ {
"prefix": "{{ inline_admin_formset.formset.prefix|escapejs }}", "prefix": "{{ inline_admin_formset.formset.prefix|escapejs }}",
"addText": "{% filter escapejs %}{% blocktrans with inline_admin_formset.opts.verbose_name|capfirst as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}", "addText": "{% filter escapejs %}{% blocktrans with inline_admin_formset.opts.verbose_name|capfirst as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}{% endfilter %}",
"deleteText": "{% filter escapejs %}{% trans 'Remove' %}{% endfilter %}" "deleteText": "{% filter escapejs %}{% trans 'Remove' %}{% endfilter %}"
} }
</script> </script>
<div class="default_order_field" default_order_field="{{ inline_admin_formset.formset.default_order_field }}" default_order_direction="{{ inline_admin_formset.formset.default_order_direction }}"></div> <div class="default_order_field" default_order_field="{{ inline_admin_formset.formset.default_order_field }}" default_order_direction="{{ inline_admin_formset.formset.default_order_direction }}"></div>

View File

@ -20,7 +20,7 @@ ALLOWED_HOSTS = ['localhost']
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ENGINE': 'django.db.backends.postgresql',
'NAME': 'barbacompta', 'NAME': 'barbacompta',
} }
} }