123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 |
- require 'schild/version'
- require 'sequel'
- module Schild
-
- @db = Sequel.connect("#{ENV['S_ADAPTER']}://#{ENV['S_HOST']}/#{ENV['S_DB']}?user=#{ENV['S_USER']}&password=#{ENV['S_PASSWORD']}&zeroDateTimeBehavior=convertToNull")
- def self.connect
- @db = Sequel.connect("#{ENV['S_ADAPTER']}://#{ENV['S_HOST']}/#{ENV['S_DB']}?user=#{ENV['S_USER']}&password=#{ENV['S_PASSWORD']}&zeroDateTimeBehavior=convertToNull")
- end
- def self.db
- @db
- end
-
- class Schueler < Sequel::Model(:schueler)
- many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
- one_to_many :abschnitte, :class => :Abschnitt
- one_to_one :bk_abschluss, :class => :BKAbschluss
- one_to_many :bk_abschluss_leistungen, :class => :BKAbschlussFaecher
- one_to_one :abi_abschluss, :class => :AbiAbschluss
- one_to_many :abi_abschluss_leistungen, :class => :AbiAbschlussFaecher
- one_to_one :fhr_abschluss, :class => :FHRAbschluss
- one_to_many :fhr_abschluss_leistungen, :class => :FHRAbschlussFaecher
- one_to_many :vermerke, :class => :Vermerke
- one_to_one :schuelerfoto, :class => :Schuelerfotos
- one_to_many :sprachenfolge, :class => :Sprachenfolge
- end
-
- class Fachklasse < Sequel::Model(:eigeneschule_fachklassen)
- one_to_many :schueler
- end
-
- class Klassenlehrer < Sequel::Model(:k_lehrer)
- one_to_one :abschnitt, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
- end
-
- class Abschnitt < Sequel::Model(:schuelerlernabschnittsdaten)
- many_to_one :schueler, :class => :Schueler, :key => :Schueler_ID
- one_to_many :noten, :class => :Noten
- many_to_one :klassenlehrer, :class => :Klassenlehrer, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
- end
-
- class Noten < Sequel::Model(:schuelerleistungsdaten)
- many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
- many_to_one :fach, :class => :Faecher, :key => :Fach_ID
- end
-
- class Faecher < Sequel::Model(:eigeneschule_faecher)
-
- one_to_one :noten
- one_to_many :abi_abschluss_leistungen
- one_to_one :sprachenfolge, :class => :Sprachenfolge, :key => :Fach_ID
- end
-
- class BKAbschluss < Sequel::Model(:schuelerbkabschluss)
- one_to_one :schueler
- end
-
- class BKAbschlussFaecher < Sequel::Model(:schuelerbkfaecher)
- many_to_one :schueler
- end
-
- class AbiAbschluss < Sequel::Model(:schuelerabitur)
- one_to_one :schueler
- end
-
- class AbiAbschlussFaecher < Sequel::Model(:schuelerabifaecher)
- many_to_one :schueler
- many_to_one :fach, :class => :Faecher, :key => :Fach_ID
- end
-
- class FHRAbschluss < Sequel::Model(:schuelerfhr)
- one_to_one :schueler
- end
-
- class FHRAbschlussFaecher < Sequel::Model(:schuelerfhrfaecher)
- many_to_one :schueler
- many_to_one :fach, :class => :Faecher, :key => :Fach_ID
- end
-
- class Sprachenfolge < Sequel::Model(:schuelersprachenfolge)
- many_to_one :fach, :class => :Faecher, :key => :Fach_ID
- end
-
- class Vermerke < Sequel::Model(:schuelervermerke)
- many_to_one :Schueler
- end
-
- class Schuelerfotos < Sequel::Model(:schuelerfotos)
- one_to_one :schueler
- end
-
- class Schule < Sequel::Model(:eigeneschule)
- end
-
- class Nutzer < Sequel::Model(:users)
- end
- end
- module SchildErweitert
-
- if Module.private_method_defined? :include
- class Module
- public :include
- end
- end
-
-
- module CoreExtensions
- module String
- def snake_case
- return downcase if match(/\A[A-Z]+\z/)
- gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
- gsub(/([a-z])([A-Z])/, '\1_\2').
- downcase
- end
- end
- module Symbol
- def snake_case
- to_s.snake_case
- end
- end
- module Schueler
- def entlassart
- return self.entlass_art if self.respond_to?(:entlass_art)
- self.Entlassart
- end
- end
- module Fachklasse
- def dqr_niveau
- return self.DQR_Niveau if self.respond_to?(:DQR_Niveau)
- "Alte Schild-Version ohne DQR-Niveau"
- end
- end
- end
-
-
- module SchildTypeSaver
- Symbol.include SchildErweitert::CoreExtensions::Symbol
- String.include CoreExtensions::String
-
-
- def self.included(klass)
- klass.columns.each do |column|
- name = column.snake_case
- MethodLogger::Methods.add(klass, name)
-
- define_method(("_"+name.to_s).to_sym) {public_send(column)}
- define_method(name) do |allow_nil=false|
- ret = public_send(column)
- if allow_nil || ret
- ret = ret.strip if ret.class == String
- ret
- else
- create_null_object(klass, column)
- end
- end
- end
- end
- def create_null_object(klass, column)
- k = Schild.db.schema_type_class(klass.db_schema[column][:type])
- if k.class == Array
-
-
- Time.new(1899)
- elsif k == Integer
- 0
- elsif k == Float
- 0.0
- else
-
- k.new
- end
- end
- end
-
-
- module MethodLogger
- class Methods
- @@accessor_methods = {}
- def self.add(klass, meth)
- @@accessor_methods[klass] ||= []
- @@accessor_methods[klass] << meth
- end
- def self.list(klass)
- @@accessor_methods[klass]
- end
- end
- end
-
- module NotenHelfer
-
-
-
- @note = %w[6 5- 5 5+ 4- 4 4+ 3- 3 3+ 2- 2 2+ 1- 1 1+]
- def self.punkte_aus_note(note)
- return if note.nil?
- @note.index(note)
- end
- def self.note_aus_punkten(punkte)
- return unless punkte && punkte.to_i.between?(1,15) || punkte == "0"
- return punkte if ((punkte.to_i == 0) && (punkte.size > 1))
- return if (punkte.class == String) && punkte.empty?
- @note[punkte.to_i]
- end
-
- def note_s(ziffer)
- case ziffer
- when "1", "1+", "1-"
- "sehr gut"
- when "2", "2+", "2-"
- "gut"
- when "3", "3+", "3-"
- "befriedigend"
- when "4", "4+", "4-"
- "ausreichend"
- when "5", "5+", "5-"
- "mangelhaft"
- when "6"
- "ungenügend"
- when 'NB'
- "––––––"
- when "E1"
- "mit besonderem Erfolg teilgenommen"
- when "E2"
- "mit Erfolg teilgenommen"
- when 'E3'
- "teilgenommen"
- end
- end
- end
-
-
-
-
-
-
-
- Schild.constants.map {|name| Schild.const_get(name)}.select {|o| o.is_a?(Class)}.each do |klass|
- name = Schild.const_get(klass.to_s).name.split("::").last
- klass = Class.new(klass) do
- include SchildTypeSaver
- end
- name = const_set(name, klass)
- end
- Fachklasse.include CoreExtensions::Fachklasse
- Schueler.include CoreExtensions::Schueler
-
- class Schueler
-
- def akt_halbjahr
- abschnitte.last
- end
-
- def halbjahr(jahr, abschnitt)
- abschnitte_dataset.where(:jahr => jahr, :abschnitt => abschnitt).first
- end
-
- def anrede
- self.geschlecht == 3 ? "Herr" : "Frau"
- end
-
- def schueler_in
- self.geschlecht == 3 ? "Schüler" : "Schülerin"
- end
-
- def studierende_r
- self.geschlecht == 3 ? "Studierender" : "Studierende"
- end
-
- def berufsbezeichnung_mw
- return "Keine Fachklasse zugeordnet" if self.fachklasse.nil?
- self.geschlecht == 3 ? self.fachklasse.bezeichnung : self.fachklasse.beschreibung_w
- end
-
- def volljaehrig?
- self.volljaehrig == "+"
- end
-
- def volljaehrig_bei?(datum)
- return false if datum.nil? || self.Geburtsdatum.nil?
- geb, datum = self.Geburtsdatum.to_date, datum.to_date
- (datum.year - geb.year - ((datum.month > geb.month || (datum.month == geb.month && datum.day >= geb.day)) ? 0 : 1)) >= 18
- end
-
- def foto_vorhanden?
- !!(self.schuelerfoto && self.schuelerfoto.foto)
- end
-
- def foto
- self.schuelerfoto.foto if self.foto_vorhanden?
- end
- end
-
- class Abschnitt
- dataset_module do
-
- def jahr(i)
- where(:Jahr => i)
- end
-
- def halbjahr(i,j)
- jahr(i).where(:Abschnitt => j)
- end
-
- def akt_halbjahr
- halbjahr(Time.new.year-1, 1).first
- end
- end
-
- def faecher_nach_id(id)
- noten.select{ |n| n.fach.Fachgruppe_ID == id && n.AufZeugnis == '+' }.sort_by{ |n| n.fach.SortierungS2 }
- end
-
- def berufsuebergreifend
- faecher_nach_id 10
- end
-
- def berufsbezogen
- faecher_nach_id 20
- end
-
- def differenzierungsbereich
- faecher_nach_id 30
- end
-
- def faechergruppen
- [berufsuebergreifend, berufsbezogen, differenzierungsbereich]
- end
-
- def v_name_klassenlehrer
- return "Kein Klassenlehrer angelegt" if klassenlehrer.nil?
- v = klassenlehrer.vorname
- n = klassenlehrer.nachname
- "#{v[0]}. #{n}"
- end
-
- def klassenlehrer_in
- return "Kein Klassenlehrer angelegt" if klassenlehrer.nil?
- klassenlehrer.geschlecht == "3" ? "Klassenlehrer" : "Klassenlehrerin"
- end
-
- def schuljahr
- jahr = self.jahr
- "#{jahr}/#{jahr-1999}"
- end
- end
-
- class Noten
- include NotenHelfer
-
- def note
- note_s self.noten_krz
- end
-
- def bezeichnung
- fach.bezeichnung
- end
-
- def fachgruppe_ID
- fach.fachgruppe_id
- end
- end
-
- class BKAbschluss
-
- def zulassung?
- self.Zulassung == "+"
- end
-
- def zulassung_ba?
- self.ZulassungBA == "+"
- end
-
- def bestanden_ba?
- self.BestandenBA == "+"
- end
- end
-
- class BKAbschlussFaecher
- include NotenHelfer
-
- def fach_schriftlich?
- self.FachSchriftlich == "+"
- end
-
- def fach_muendlich?
- self.MdlPruefung == "+"
- end
- def note(notenart=:note_abschluss_ba)
- note_s send(notenart)
- end
- end
-
- class AbiAbschluss
-
- def zulassung?
- self.Zugelassen == "+"
- end
- alias_method :zugelassen?, :zulassung?
-
- def bestanden_abi?
- self.PruefungBestanden == "+"
- end
- alias_method :pruefung_bestanden?, :bestanden_abi?
- def latinum?
- self.Latinum == "+"
- end
- def kl_latinum?
- self.KlLatinum == "+"
- end
- def graecum?
- self.Graecum == "+"
- end
- def hebraicum?
- self.Hebraicum == "+"
- end
- end
-
- class AbiAbschlussFaecher
- include NotenHelfer
- def note(notenart)
- note_s send(notenart)
- end
- end
-
- class FHRAbschlussFaecher
- include NotenHelfer
- def note(notenart)
- note_s send(notenart)
- end
- end
-
- class Schule
-
- def self.schulnummer
- self.first.schul_nr
- end
-
- def self.v_name_schulleiter
- "#{self.first.schulleiter_vorname[0]}. #{self.first.schulleiter_name}"
- end
-
- def self.schulleiter_in
- self.first.schulleiter_geschlecht == 3 ? "Schulleiter" : "Schulleiterin"
- end
-
- def self.ort
- self.first.ort
- end
- end
-
- class Nutzer
- alias :name :us_name
- alias :login :us_login_name
- alias :passwort :us_password
- alias :password :passwort
-
- def passwort?(passwort='')
- crypt(passwort) == self.passwort
- end
- alias :password? :passwort?
-
- def crypt(passwort)
- passwort.codepoints.map{|c| ((c/16)*32+15-c).chr}.join('')
- end
- end
- end
|