2020-10-22 14:02:59 +00:00
from datetime import date
2023-12-30 17:46:15 +00:00
from django . utils . http import urlencode
2020-09-21 12:27:16 +00:00
from django . db import models
2020-11-17 09:56:24 +00:00
from django . utils . html import format_html
2023-12-30 17:46:15 +00:00
import urllib
from django . utils . safestring import mark_safe
2020-09-21 12:27:16 +00:00
2020-10-21 11:00:44 +00:00
from . settings import ACCOUNTS
2020-09-22 10:21:05 +00:00
2020-10-22 09:36:16 +00:00
2023-02-27 17:09:29 +00:00
EMAIL_STATES = { ' NONE ' : ' noch keine Mail versendet ' ,
2023-02-27 17:09:29 +00:00
' INF ' : ' die Benachrichtigung zur Projektabschlussmail wurde versendet ' ,
' CLOSE ' : ' die Projektabschlussmail wurde versendet ' ,
' END ' : ' alle automatischen Mails, auch surveyMail, wurden versendet ' }
2023-02-27 17:09:29 +00:00
2020-09-30 12:17:38 +00:00
class Volunteer ( models . Model ) :
2020-11-17 15:42:25 +00:00
realname = models . CharField ( max_length = 200 , null = True , verbose_name = " Realname " ,
2023-10-25 15:50:40 +00:00
help_text = " Bitte gib deinen Vornamen und deinen Nachnamen ein. " , default = ' oi ' )
2020-11-17 09:56:24 +00:00
email = models . EmailField ( max_length = 200 , null = True , verbose_name = ' E-Mail-Adresse ' ,
2020-11-17 15:46:32 +00:00
help_text = format_html ( ' Bitte gib deine E-Mail-Adresse ein, damit dich<br>Wikimedia Deutschland bei Rückfragen oder für<br>die Zusage kontaktieren kann. ' ) )
2020-10-22 14:02:59 +00:00
# the following Fields are not supposed to be edited by users
2023-10-25 15:50:40 +00:00
2023-02-27 17:09:29 +00:00
granted = models . BooleanField ( null = True , verbose_name = ' bewilligt ' )
granted_date = models . DateField ( null = True , verbose_name = ' bewilligt am ' )
2021-04-12 11:44:45 +00:00
survey_mail_date = models . DateField ( verbose_name = ' Umfragemail wurde verschickt am ' , null = True , blank = True )
2023-02-27 17:09:29 +00:00
mail_state = models . CharField ( max_length = 6 , choices = EMAIL_STATES . items ( ) , default = ' NONE ' )
2023-02-27 17:09:29 +00:00
survey_mail_send = models . BooleanField ( default = False , verbose_name = ' Keine Umfragemail schicken ' )
2023-02-27 17:09:29 +00:00
2021-07-06 11:00:34 +00:00
2020-10-20 10:00:59 +00:00
@classmethod
def set_granted ( cl , key , b ) :
obj = cl . objects . get ( pk = key )
obj . granted = b
2020-10-22 14:02:59 +00:00
obj . granted_date = date . today ( )
2020-10-20 10:00:59 +00:00
obj . save ( )
2020-09-30 10:15:58 +00:00
class Meta :
abstract = True
2020-09-30 09:04:47 +00:00
2020-10-22 09:36:16 +00:00
2023-10-25 15:50:40 +00:00
2020-10-26 10:00:12 +00:00
class Extern ( Volunteer ) :
''' abstract basis class for all data entered by extern volunteers '''
2023-10-25 15:50:40 +00:00
2020-11-17 15:42:25 +00:00
username = models . CharField ( max_length = 200 , null = True , verbose_name = ' Benutzer_innenname ' ,
2023-10-25 15:50:40 +00:00
help_text = format_html ( " Wikimedia Benutzer_innenname " ) )
2020-10-26 10:00:12 +00:00
2020-10-29 14:05:11 +00:00
# the following Fields are not supposed to be edited by users
service_id = models . CharField ( max_length = 15 , null = True , blank = True )
def save ( self , * args , * * kwargs ) :
2021-10-07 08:29:04 +00:00
# we don't call save with args/kwargs to avoid UNIQUE CONSTRAINT errors
# but maybe there is a better solution?
2021-10-06 14:15:58 +00:00
super ( ) . save ( )
2020-10-29 14:05:11 +00:00
self . service_id = type ( self ) . __name__ + str ( self . pk )
2021-10-06 14:15:58 +00:00
super ( ) . save ( )
2020-10-29 14:05:11 +00:00
2020-10-26 10:00:12 +00:00
class Meta :
abstract = True
2021-07-06 11:00:34 +00:00
class ConcreteExtern ( Extern ) :
''' needed because we can ' t initiate abstract base classes in the view '''
pass
2021-07-08 06:00:28 +00:00
class Account ( models . Model ) :
code = models . CharField ( ' Kostenstelle ' , max_length = 5 , default = " DEF " ,
null = False , primary_key = True )
2021-11-03 12:43:40 +00:00
description = models . CharField ( ' Beschreibung ' , max_length = 60 , default = ' NO DESCRIPTION ' )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2021-07-07 13:16:39 +00:00
def __str__ ( self ) :
2021-07-08 06:00:28 +00:00
return f " { self . code } { self . description } "
2021-07-07 13:16:39 +00:00
2020-09-30 12:17:38 +00:00
class Project ( Volunteer ) :
2023-02-27 17:09:29 +00:00
end_mail_send = models . BooleanField ( default = False , verbose_name = ' Keine Projektabschlussmail schicken ' )
2020-11-02 09:58:20 +00:00
name = models . CharField ( max_length = 200 , verbose_name = ' Name des Projekts ' )
description = models . CharField ( max_length = 500 , verbose_name = " Kurzbeschreibung " , null = True )
2021-11-03 12:47:39 +00:00
start = models . DateField ( ' Startdatum ' , null = True )
2020-10-21 11:53:39 +00:00
end = models . DateField ( ' Erwartetes Projektende ' , null = True )
2021-04-12 09:48:41 +00:00
otrs = models . URLField ( max_length = 300 , null = True , verbose_name = ' OTRS-Link ' )
plan = models . URLField ( max_length = 2000 , null = True , blank = True , verbose_name = " Link zum Förderplan " )
page = models . URLField ( max_length = 2000 , null = True , blank = True , verbose_name = " Link zur Projektseite " )
2020-11-02 09:58:20 +00:00
urls = models . CharField ( max_length = 2000 , null = True , blank = True , verbose_name = " Weitere Links " )
group = models . CharField ( max_length = 2000 , null = True , blank = True , verbose_name = " Mitorganisierende " )
location = models . CharField ( max_length = 2000 , null = True , blank = True , verbose_name = " Ort/Adresse/Location " )
participants_estimated = models . IntegerField ( blank = True , null = True , verbose_name = ' Teilnehmende angefragt ' )
participants_real = models . IntegerField ( blank = True , null = True , verbose_name = ' Teilnehmende ausgezählt ' )
2020-11-02 10:56:07 +00:00
insurance = models . BooleanField ( default = False , verbose_name = ' Haftpflichtversicherung ' )
insurance_technic = models . BooleanField ( default = False , verbose_name = ' Technikversicherung Ausland ' )
support = models . CharField ( max_length = 300 , blank = True , null = True , verbose_name = ' Betreuungsperson und Vertretung ' )
2023-02-27 17:09:29 +00:00
cost = models . IntegerField ( blank = True , null = True , verbose_name = ' Kosten ' )
2021-11-01 14:21:25 +00:00
account = models . ForeignKey ( ' Account ' , on_delete = models . CASCADE , null = True , to_field = ' code ' , db_constraint = False )
2020-11-02 10:56:07 +00:00
granted_from = models . CharField ( max_length = 100 , null = True , verbose_name = ' Bewilligt von ' )
2023-02-27 17:09:28 +00:00
notes = models . TextField ( max_length = 1000 , null = True , blank = True , verbose_name = ' Anmerkungen ' )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2023-02-27 17:09:29 +00:00
2023-02-27 17:09:29 +00:00
2020-10-22 14:02:59 +00:00
# the following Fields are not supposed to be edited by users
2020-10-28 14:04:53 +00:00
pid = models . CharField ( max_length = 15 , null = True , blank = True )
2023-02-27 17:09:28 +00:00
status = models . CharField ( max_length = 3 , choices = ( ( ' RUN ' , ' läuft ' ) , ( ' END ' , ' beendet ' ) , ( ' NOT ' , ' nicht stattgefunden ' ) ) , default = ' RUN ' )
2021-10-04 08:43:50 +00:00
finance_id = models . CharField ( max_length = 15 , null = True , blank = True )
2021-10-04 10:39:09 +00:00
project_of_year = models . IntegerField ( default = 0 )
2023-02-27 17:09:29 +00:00
end_quartal = models . CharField ( max_length = 15 , null = True , blank = True , verbose_name = " Quartal Projekt Ende " )
2020-11-02 10:56:07 +00:00
2023-12-30 17:46:15 +00:00
2020-10-06 13:15:05 +00:00
def save ( self , * args , * * kwargs ) :
2021-10-04 12:49:18 +00:00
''' we generate the autogenerated fields here '''
2021-10-07 08:29:04 +00:00
# we don't call save with args/kwargs to avoid UNIQUE CONSTRAINT errors
# but maybe there is a better solution?
2023-12-30 17:46:15 +00:00
preotrs = self . otrs
#postotrs = ''
#for n in range(len(preotrs)):
# if preotrs[n] == ';':
# postotrs += '\;'
# else:
# postotrs += preotrs[n]
#print(self.otrs)
#print(preotrs)
#print(postotrs)
postotrs = urllib . parse . quote ( preotrs , safe = ' :;/=?& ' )
self . otrs = mark_safe ( urllib . parse . unquote ( postotrs ) )
2023-12-27 15:48:11 +00:00
startyear_tmp = ' NONE '
if self . pid :
2023-12-30 17:46:15 +00:00
print ( ' self pid last four ' , self . pid [ : 4 ] , self . start . year )
if int ( self . pid [ : 4 ] ) != int ( self . start . year ) :
2023-12-27 15:48:11 +00:00
startyear_tmp = self . start . year
2023-12-30 17:46:15 +00:00
print ( ' the startyear_tmp is as follows ' , startyear_tmp )
2021-10-05 08:13:19 +00:00
super ( ) . save ( )
2023-12-27 15:48:11 +00:00
if startyear_tmp == ' NONE ' :
self . pid = str ( self . start . year ) + ' - ' + str ( self . account . code ) + str ( self . pk ) . zfill ( 3 )
# self.pid = str(self.account.code) + str(self.pk).zfill(3)
2023-02-27 17:09:29 +00:00
# generation of field quartals
if self . end . month in [ 1 , 2 , 3 ] :
self . end_quartal = ' Q1 '
if self . end . month in [ 4 , 5 , 6 ] :
self . end_quartal = ' Q2 '
if self . end . month in [ 7 , 8 , 9 ] :
self . end_quartal = ' Q3 '
if self . end . month in [ 10 , 11 , 12 ] :
self . end_quartal = ' Q4 '
# generation of pid and financeID
2023-12-27 15:48:11 +00:00
# project of year is true if entry gets updated with changes.. but year can change!!!!!!!!
if self . project_of_year :
print ( ' oi oi oi oi oi ' )
print ( self . pid )
2023-02-27 17:09:29 +00:00
2023-12-27 15:48:11 +00:00
# project of year is false if entry gets saved as new
if not self . project_of_year or startyear_tmp != ' NONE ' :
print ( ' AAA ' )
print ( ' self projekt of year ' , self . project_of_year , self . start . year )
2021-10-07 08:29:04 +00:00
# we need to determine if this is a new year with its first new project...
2021-10-04 10:39:09 +00:00
year = self . start . year
2023-02-27 17:09:29 +00:00
#print(year)
2021-10-04 10:57:13 +00:00
projects = Project . objects . filter ( start__year = year )
2023-12-27 15:48:11 +00:00
print ( ' projects after filter of startyear of project ' , projects )
2021-10-04 10:57:13 +00:00
if not projects :
2021-11-08 13:31:10 +00:00
#print('BBB')
2021-10-04 10:57:13 +00:00
self . project_of_year = 1
2023-02-27 17:09:29 +00:00
self . pid = str ( self . start . year ) + ' - ' + str ( self . account . code ) + str ( self . project_of_year ) . zfill ( 3 )
2021-10-04 10:57:13 +00:00
else :
2021-11-08 13:31:10 +00:00
#print('CCC')
2023-02-27 17:09:29 +00:00
# get the project of year number of latest entry
2021-10-04 12:14:01 +00:00
projects = projects . order_by ( " -project_of_year " ) [ 0 ]
2023-02-27 17:09:29 +00:00
# add one to value of latest entry
2021-10-04 12:14:01 +00:00
self . project_of_year = int ( projects . project_of_year ) + 1
2023-02-27 17:09:29 +00:00
self . pid = str ( self . start . year ) + ' - ' + str ( self . account . code ) + str ( self . project_of_year ) . zfill ( 3 )
if str ( self . account . code ) == ' 21111 ' :
self . finance_id = str ( self . account . code ) + str ( self . project_of_year ) . zfill ( 3 )
else :
self . finance_id = str ( self . account . code )
2021-10-05 08:13:19 +00:00
super ( ) . save ( )
2020-10-06 13:15:05 +00:00
2020-09-30 09:04:47 +00:00
def __str__ ( self ) :
2020-10-21 11:00:44 +00:00
return f " { self . pid } { self . name } "
2020-09-30 11:31:19 +00:00
2020-10-22 09:36:16 +00:00
2020-10-26 10:38:56 +00:00
class Intern ( Volunteer ) :
2023-02-27 17:09:29 +00:00
''' abstract base class for data entry from /intern (except Project) '''
2021-04-12 09:48:41 +00:00
request_url = models . URLField ( max_length = 2000 , verbose_name = ' Antrag (URL) ' )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = ' interne Anmerkungen ' )
2020-10-26 10:38:56 +00:00
class Meta :
abstract = True
2021-07-07 07:42:51 +00:00
class ConcreteVolunteer ( Volunteer ) :
''' needed because we can ' t initiate abstract base classes in the view '''
pass
2020-10-26 10:38:56 +00:00
class HonoraryCertificate ( Intern ) :
''' this class is also used for accreditations '''
2020-10-26 12:15:38 +00:00
project = models . ForeignKey ( Project , null = True , blank = True , on_delete = models . SET_NULL )
2020-09-30 11:31:19 +00:00
def __str__ ( self ) :
return " Certificate for " + self . realname
2020-09-30 11:46:06 +00:00
2020-10-22 09:36:16 +00:00
2020-11-02 13:04:01 +00:00
TRANSPORT_CHOICES = { ' BAHN ' : ' Bahn ' ,
' NONE ' : ' Keine Fahrtkosten ' ,
' OTHER ' : ' Sonstiges (mit Begründung) ' }
PAYEDBY_CHOICES = { ' WMDE ' : ' WMDE ' ,
' REQU ' : ' Antragstellender Mensch ' }
2023-02-27 17:09:29 +00:00
HOTEL_CHOICES = { ' TRUE ' : format_html ( ' Hotelzimmer benötigt ' ) ,
' FALSE ' : format_html ( ' Kein Hotelzimmer benötigt ' )
}
2023-02-27 17:09:29 +00:00
from django . contrib . contenttypes . models import ContentType
2023-02-27 17:09:29 +00:00
class Travel ( Extern ) :
2023-02-27 17:09:29 +00:00
# project variable is now null true and blank true, which means it can be saved without project id to be later on filled out by admins
project = models . ForeignKey ( Project , on_delete = models . CASCADE , null = True , blank = True )
project_name = models . CharField ( max_length = 50 , null = True , blank = True , verbose_name = ' Projektname: ' )
transport = models . CharField ( max_length = 5 , choices = TRANSPORT_CHOICES . items ( ) , default = ' BAHN ' , verbose_name = ' Transportmittel: ' )
2020-11-02 13:04:01 +00:00
other_transport = models . CharField ( max_length = 200 , null = True , blank = True , verbose_name = ' Sonstige Transportmittel (mit Begründung) ' )
2023-02-27 17:09:29 +00:00
travelcost = models . CharField ( max_length = 10 , default = " 0 " , verbose_name = ' Fahrtkosten ' )
2023-02-27 17:09:29 +00:00
checkin = models . DateField ( blank = True , null = True , verbose_name = ' Anreise ' )
checkout = models . DateField ( blank = True , null = True , verbose_name = ' Abreise ' )
2020-11-02 13:04:01 +00:00
payed_for_hotel_by = models . CharField ( max_length = 4 , choices = PAYEDBY_CHOICES . items ( ) , blank = True , null = True , verbose_name = ' Kostenauslage Hotel durch ' )
payed_for_travel_by = models . CharField ( max_length = 4 , choices = PAYEDBY_CHOICES . items ( ) , blank = True , null = True , verbose_name = ' Kostenauslage Fahrt durch ' )
2023-02-27 17:09:29 +00:00
hotel = models . CharField ( max_length = 10 , choices = HOTEL_CHOICES . items ( ) , verbose_name = ' Hotelzimmer benötigt: ' )
2023-02-27 17:09:29 +00:00
notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = ' Anmerkungen ' )
request_url = models . URLField ( max_length = 2000 , verbose_name = ' Antrag (URL) ' )
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = ' interne Anmerkungen ' )
2023-02-27 17:09:29 +00:00
project_end = models . DateField ( blank = True , null = True , verbose_name = ' Projektende ' )
# use content type model to get the end date for the project foreign key
2023-02-27 17:09:29 +00:00
project_end_quartal = models . CharField ( max_length = 15 , null = True , blank = True , verbose_name = " Quartal Projekt Ende " )
2023-02-27 17:09:29 +00:00
from django . db . models . signals import pre_save
from django . dispatch import receiver
@receiver ( pre_save , sender = Travel , dispatch_uid = " get_project_end " )
def getProjectEnd ( sender , instance , * * kwargs ) :
#instance.project_end = instance.project.end
2023-02-27 17:09:29 +00:00
if instance . project :
instance . project_end = instance . project . end
instance . project_end_quartal = instance . project . end_quartal
2023-02-27 17:09:29 +00:00
2023-02-27 17:09:29 +00:00
# using pre save instead
2023-02-27 17:09:29 +00:00
# def save(self,*args,**kwargs):
# '''we generate the autogenerated fields here'''
# # we don't call save with args/kwargs to avoid UNIQUE CONSTRAINT errors
# # but maybe there is a better solution?
# intern_notes
# project_end = self.checkout
# super(Travel, self).save(*args,**kwargs)
2020-10-26 10:38:56 +00:00
2020-10-26 10:00:12 +00:00
#abstract base class for Library and IFG
class Grant ( Extern ) :
2020-11-18 15:03:27 +00:00
cost = models . CharField ( max_length = 10 , verbose_name = ' Kosten ' ,
help_text = " Bitte gib die ungefähr zu erwartenden Kosten in Euro an. " )
2023-02-27 17:09:28 +00:00
notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = ' Anmerkungen ' ,
2020-11-18 15:16:05 +00:00
help_text = " Bitte gib an wofür Du das Stipendium verwenden willst. " )
2020-09-30 11:46:06 +00:00
2020-09-30 12:17:38 +00:00
class Meta :
abstract = True
2020-10-20 07:35:04 +00:00
2022-11-01 10:30:30 +00:00
TYPE_CHOICES = { ' BIB ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/Zugang_zu_Fachliteratur#Bibliotheksstipendium " target= " _blank " rel= " noopener " >Bibliotheksstipendium</a> ' ) ,
' ELIT ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/Zugang_zu_Fachliteratur#eLiteraturstipendium " target= " _blank " rel= " noopener " >eLiteraturstipendium</a> ' ) ,
' MAIL ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/E-Mail-Adressen_und_Visitenkarten#E-Mail-Adressen " target= " _blank " rel= " noopener " >E-Mail-Adresse</a> ' ) ,
' IFG ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/Gebührenerstattungen_für_Behördenanfragen " target= " _blank " rel= " noopener " >Kostenübernahme IFG-Anfrage</a> ' ) ,
' LIT ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/Zugang_zu_Fachliteratur#Literaturstipendium " target= " _blank " rel= " noopener " >Literaturstipendium</a> ' ) ,
' LIST ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/E-Mail-Adressen_und_Visitenkarten#Mailinglisten " target= " _blank " rel= " noopener " >Mailingliste</a> ' ) ,
2023-02-27 17:09:29 +00:00
' TRAV ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:F % C3 % B6rderung/Reisekostenerstattungen " target= " _blank " rel= " noopener " >Reisekosten</a> ' ) ,
2022-11-01 10:30:30 +00:00
' SOFT ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/Software-Stipendien " target= " _blank " rel= " noopener " >Softwarestipendium</a> ' ) ,
' VIS ' : format_html ( ' <a href= " https://de.wikipedia.org/wiki/Wikipedia:Förderung/E-Mail-Adressen_und_Visitenkarten#Visitenkarten " target= " _blank " rel= " noopener " >Visitenkarten</a> ' ) ,
2020-11-17 12:06:07 +00:00
}
2020-10-19 12:37:51 +00:00
2020-10-20 07:35:04 +00:00
# same model is used for Library, ELitStip and Software!
2020-09-30 12:17:38 +00:00
class Library ( Grant ) :
2020-10-19 11:54:57 +00:00
2020-10-19 09:56:10 +00:00
type = models . CharField (
max_length = 4 ,
2020-10-21 11:27:05 +00:00
choices = TYPE_CHOICES . items ( ) , #attention: actually only BIB, ELIT, SOFT should be used here
2021-10-11 13:50:16 +00:00
default = ' BIB ' ,
2020-10-19 09:56:10 +00:00
)
2020-09-30 12:17:38 +00:00
library = models . CharField ( max_length = 200 )
2020-11-02 13:25:07 +00:00
duration = models . CharField ( max_length = 100 , verbose_name = " Dauer " )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2020-09-30 11:46:06 +00:00
def __str__ ( self ) :
return self . library
2020-09-30 12:17:38 +00:00
2023-02-27 17:09:28 +00:00
SELFBUY_CHOICES = { ' TRUE ' : format_html ( ' Ich möchte das Werk selbst kaufen und per Kostenerstattung bei Wikimedia Deutschland abrechnen. ' ) ,
' FALSE ' : format_html ( ' Ich möchte, dass Wikimedia Deutschland das Werk für mich kauft ' ) ,
}
2020-10-27 12:47:46 +00:00
class Literature ( Grant ) :
2020-11-18 17:02:23 +00:00
info = models . CharField ( max_length = 500 , verbose_name = ' Informationen zum Werk ' ,
help_text = format_html ( " Bitte gib alle Informationen zum benötigten Werk an,<br> \
die eine eindeutige Identifizierung ermöglichen ( Autor , Titel , Verlag , ISBN , . . . ) " ))
source = models . CharField ( max_length = 200 , verbose_name = ' Bezugsquelle ' ,
help_text = " Bitte gib an, wo du das Werk kaufen möchtest. " )
2023-02-27 17:09:28 +00:00
selfbuy = models . CharField ( max_length = 10 , verbose_name = ' Selbstkauf? ' , choices = SELFBUY_CHOICES . items ( ) , default = ' TRUE ' )
2023-02-27 17:09:29 +00:00
selfbuy_give_data = models . BooleanField ( verbose_name = format_html ( ' Datenweitergabe erlauben ' ) , help_text = format_html ( ' Ich stimme der Weitergabe meiner Daten (Name, Postadresse) an den von mir angegebenen Anbieter/Dienstleister zu. ' ) )
2023-02-27 17:09:29 +00:00
selfbuy_data = models . TextField ( max_length = 1000 , verbose_name = ' Persönliche Daten sowie Adresse ' , default = ' ' , \
2023-02-27 17:09:29 +00:00
help_text = format_html ( " Bitte gib hier alle persönlichen Daten an, die wir benötigen, um das Werk<br> \
für dich zu kaufen und es dir anschließend zu schicken ( z . B . Vorname Nachname , Anschrift , < br > \
2023-02-27 17:09:29 +00:00
Telefonnummer , E - Mail - Adresse usw . ) . Trenne die einzelnen Angaben durch Zeilenumbrüche . " ))
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2020-10-22 09:36:16 +00:00
2020-09-30 12:17:38 +00:00
class IFG ( Grant ) :
2021-04-12 09:48:41 +00:00
url = models . URLField ( max_length = 2000 , verbose_name = " URL " ,
2020-11-18 17:02:23 +00:00
help_text = " Bitte gib den Link zu deiner Anfrage bei Frag den Staat an. " )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2023-02-27 17:09:28 +00:00
2020-09-30 12:17:38 +00:00
def __str__ ( self ) :
return " IFG-Anfrage von " + self . realname
2020-10-27 10:00:58 +00:00
DOMAIN_CHOICES = { ' PEDIA ' : ' @wikipedia.de ' ,
' BOOKS ' : ' @wikibooks.de ' ,
' QUOTE ' : ' @wikiquote.de ' ,
' SOURCE ' : ' @wikisource.de ' ,
' VERSITY ' : ' @wikiversity.de ' , }
class Domain ( Extern ) :
domain = models . CharField ( max_length = 10 ,
choices = DOMAIN_CHOICES . items ( ) ,
default = ' PEDIA ' )
class Meta :
abstract = True
MAIL_CHOICES = { ' REALNAME ' : ' Vorname.Nachname ' ,
' USERNAME ' : ' Username ' ,
' OTHER ' : ' Sonstiges: ' }
2023-02-27 17:09:29 +00:00
ADULT_CHOICES = { ' TRUE ' : format_html ( ' Ich bin volljährig. ' ) ,
2023-02-27 17:09:29 +00:00
' FALSE ' : format_html ( ' Ich bin noch nicht volljährig. ' )
2023-02-27 17:09:29 +00:00
}
2020-10-27 10:00:58 +00:00
class Email ( Domain ) :
2020-10-27 11:37:18 +00:00
address = models . CharField ( max_length = 50 ,
2020-10-27 10:00:58 +00:00
choices = MAIL_CHOICES . items ( ) ,
2020-11-18 16:46:05 +00:00
default = ' USERNAME ' , verbose_name = ' Adressbestandteil ' ,
2020-11-18 17:02:23 +00:00
help_text = format_html ( " Bitte gib hier den gewünschten Adressbestandteil an,<br>der sich vor der Domain befinden soll. " ) )
2020-11-18 16:46:05 +00:00
2020-11-18 17:02:23 +00:00
other = models . CharField ( max_length = 50 , blank = True , null = True , verbose_name = " Sonstiges " )
2023-02-27 17:09:29 +00:00
adult = models . CharField ( max_length = 10 , verbose_name = ' Volljährigkeit ' , choices = ADULT_CHOICES . items ( ) , default = ' FALSE ' )
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2020-10-27 10:00:58 +00:00
class List ( Domain ) :
2020-11-18 16:46:05 +00:00
address = models . CharField ( max_length = 50 , default = ' NO_ADDRESS ' ,
verbose_name = " Adressbestandteil für Projektmailingliste " ,
help_text = format_html ( " Bitte gib hier den gewünschten Adressbestandteil an,<br>der sich vor der Domain befinden soll. " ) )
2023-02-27 17:09:29 +00:00
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )
2020-10-27 11:37:18 +00:00
PROJECT_CHOICE = { ' PEDIA ' : ' Wikipedia ' ,
' SOURCE ' : ' Wikisource ' ,
' BOOKS ' : ' Wikibooks ' ,
' QUOTE ' : ' Wikiquote ' ,
' VERSITY ' : ' Wikiversity ' ,
' VOYAGE ' : ' Wikivoyage ' ,
' DATA ' : ' Wikidata ' ,
' NEWS ' : ' Wikinews ' ,
' COMMONS ' : ' Wikimedia Commons ' }
2020-11-18 15:31:55 +00:00
BC_VARIANT = { ' PIC ' : ' mit Bild ' ,
' NOPIC ' : ' ohne Bild ' }
2020-10-27 11:37:18 +00:00
class BusinessCard ( Extern ) :
project = models . CharField ( max_length = 20 , choices = PROJECT_CHOICE . items ( ) ,
2020-11-18 15:24:51 +00:00
default = ' PEDIA ' , verbose_name = ' Wikimedia-Projekt ' ,
help_text = ' Für welches Wikimedia-Projekt möchtest Du Visitenkarten? ' )
data = models . TextField ( max_length = 1000 , verbose_name = ' Persönliche Daten für die Visitenkarten ' , default = ' ' ,
help_text = format_html ( " Bitte gib hier alle persönlichen Daten an, und zwar genau so,<br> \
wie sie ( auch in der entsprechenden Reihenfolge ) auf den Visitenkarten stehen sollen < br > \
( z . B . Vorname Nachname , Benutzer : / Benutzerin : , Benutzer - / - innenname , Anschrift , < br > \
Telefonnummer , E - Mail - Adresse usw . ) . Trenne die einzelnen Angaben durch Zeilenumbrüche . < br > \
Hinweis : Telefonnummern bilden wir üblicherweise im internationalen Format gemäß < br > \
DIN 5008 ab . Als anzugebende E - Mail - Adresse empfehlen wir dir eine Wikimedia - Projekt - < br > \
Adresse , die du ebenfalls beantragen kannst , sofern du nicht bereits eine besitzt . " ))
2020-10-27 11:37:18 +00:00
variant = models . CharField ( max_length = 5 , choices = BC_VARIANT . items ( ) ,
2020-11-18 15:31:55 +00:00
default = ' NOPIC ' , verbose_name = ' Variante ' ,
help_text = format_html ( ' so sehen die Varianten aus: <a href= " https://upload.wikimedia.org/wikipedia/commons/c/cd/Muster_Visitenkarten_WMDE_2018.jpg " > \
mit Bild < / a > < a href = " https://upload.wikimedia.org/wikipedia/commons/d/d3/Muster_Visitenkarte_WMDE.png " > ohne Bild < / a > ' ))
2023-02-27 17:09:28 +00:00
url_of_pic = models . CharField ( max_length = 200 , verbose_name = ' Url des Bildes ' , default = ' ' , help_text = " Bitte gib die Wikimedia-Commons-URL des Bildes an. " )
2020-11-18 15:31:55 +00:00
sent_to = models . TextField ( max_length = 1000 , verbose_name = ' Versandadresse ' ,
default = ' ' , help_text = " Bitte gib den Namen und die vollständige Adresse ein, an welche die Visitenkarten geschickt werden sollen. " )
2023-02-27 17:09:29 +00:00
send_data_to_print = models . BooleanField ( default = False , verbose_name = format_html ( ' Datenweitergabe erlauben ' ) , help_text = format_html ( ' Hiermit erlaube ich die Weitergabe meiner Daten (Name, Postadresse) an den von Wikimedia<br> Deutschland ausgewählten Dienstleister (z. B. <a href= " wir-machen-druck.de " >wir-machen-druck.de</a>) zum Zwecke des direkten <br> Versands der Druckerzeugnisse an mich. ' ) )
intern_notes = models . TextField ( max_length = 1000 , blank = True , verbose_name = " interne Anmerkungen " )