浏览代码

import/export

hmt 7 年之前
父节点
当前提交
ea66d96a9e
共有 4 个文件被更改,包括 107 次插入8 次删除
  1. 1 0
      Gemfile
  2. 7 3
      Gemfile.lock
  3. 93 4
      bewerbung.rb
  4. 6 1
      config.ru

+ 1 - 0
Gemfile

@@ -8,3 +8,4 @@ gem 'slim'
 gem 'sequel'
 gem 'sqlite3'
 gem 'pry'
+gem 'spreadsheet'

+ 7 - 3
Gemfile.lock

@@ -16,7 +16,7 @@ GEM
       mime-types (~> 3.0)
       representable (~> 3.0)
       retriable (>= 2.0, < 4.0)
-    google_drive (2.1.6)
+    google_drive (2.1.7)
       google-api-client (>= 0.11.0, < 0.14.0)
       googleauth (>= 0.5.0, < 1.0.0)
       nokogiri (>= 1.5.3, < 2.0.0)
@@ -50,7 +50,7 @@ GEM
       coderay (~> 1.1.0)
       method_source (~> 0.9.0)
     public_suffix (3.0.1)
-    puma (3.10.0)
+    puma (3.11.0)
     rack (2.0.3)
     rack-protection (2.0.0)
       rack
@@ -62,12 +62,13 @@ GEM
       declarative-option (< 0.2.0)
       uber (< 0.2.0)
     retriable (3.1.1)
+    ruby-ole (1.2.12.1)
     sass (3.5.3)
       sass-listen (~> 4.0.0)
     sass-listen (4.0.0)
       rb-fsevent (~> 0.9, >= 0.9.4)
       rb-inotify (~> 0.9, >= 0.9.7)
-    sequel (5.2.0)
+    sequel (5.3.0)
     signet (0.8.1)
       addressable (~> 2.3)
       faraday (~> 0.9)
@@ -81,6 +82,8 @@ GEM
     slim (3.0.9)
       temple (>= 0.7.6, < 0.9)
       tilt (>= 1.3.3, < 2.1)
+    spreadsheet (1.1.5)
+      ruby-ole (>= 1.0)
     sqlite3 (1.3.13)
     temple (0.8.0)
     tilt (2.0.8)
@@ -97,6 +100,7 @@ DEPENDENCIES
   sequel
   sinatra
   slim
+  spreadsheet
   sqlite3
 
 BUNDLED WITH

+ 93 - 4
bewerbung.rb

@@ -1,12 +1,17 @@
 require 'sinatra'
 require "pry"
 require 'sequel'
+require 'spreadsheet'
 # require 'mailgun-ruby'
 # require 'envyable'
 # env.yml mit den unten verwendeten ENV anleg
 # Envyable.load("#{File.dirname(__FILE__)}/config/env.yml")
 #
 DB = Sequel.connect("sqlite://form.db")
+STATKUE = Sequel.connect("sqlite://statkue.db")
+
+Sequel::Model.strict_param_setting = false
+Sequel::Model.plugin :csv_serializer
 
 class SchuelerBasisdaten < Sequel::Model(:'SchuelerBasisdaten.dat')
   one_to_one :tracker
@@ -18,8 +23,15 @@ class SchuelerBasisdaten < Sequel::Model(:'SchuelerBasisdaten.dat')
   end
 
   def before_save
-    self[:"Geburtsdatum"] = Time.parse(self[:"Geburtsdatum"]).strftime("%d.%m.%Y")
+    begin
+      self[:"Geburtsdatum"] = Time.parse(self[:"Geburtsdatum"]).strftime("%d.%m.%Y")
+    rescue
+      self[:"Geburtsdatum"] = Time.strptime(self[:"Geburtsdatum"], "%m/%d/%Y").strftime("%d.%m.%Y")
+    end
     self[:"Schulpflicht erf."] ||= volljaehrig?(self[:"Geburtsdatum"]) ? "J" : "N"
+    self[:"Verpflichtung Sprachförderkurs"] ||= "N"
+    self[:"Teilnahme Sprachförderkurs"] ||= "N"
+    self[:"Autist"] ||= "N"
     super
   end
 end
@@ -29,9 +41,19 @@ class SchuelerZusatzdaten < Sequel::Model(:'SchuelerZusatzdaten.dat')
 end
 class SchuelerErzieher < Sequel::Model(:'SchuelerErzieher.dat')
   one_to_one :tracker
+
+  def before_save
+    self[:"Vorname 1.Person"] ||= ""
+    self[:"Nachname1.Person"] ||= ""
+    self[:"Anrede 1.Person"] ||= ""
+    self[:"Erzieherart"] ||= ""
+    self[:"Straße"] ||= ""
+    self[:"PLZ"] ||= ""
+    self[:"Ort"] ||= ""
+  end
 end
 class SchuelerTelefonnummern < Sequel::Model(:'SchuelerTelefonnummern.dat')
-  one_to_one :tracker
+  many_to_one :tracker
 
   def before_save
     self[:"Art"] ||= "Erzieher"
@@ -42,7 +64,7 @@ class Tracker < Sequel::Model
   one_to_one :schueler, :class => SchuelerBasisdaten, :key => :id
   one_to_one :zusatzdaten, :class => SchuelerZusatzdaten, :key => :id
   one_to_one :erzieher, :class => SchuelerErzieher, :key => :id
-  one_to_one :telefon, :class => SchuelerTelefonnummern, :key => :id
+  one_to_many :telefon, :class => SchuelerTelefonnummern, :key => :id
 end
 
 class BasisApp < Sinatra::Application
@@ -55,6 +77,18 @@ class BasisApp < Sinatra::Application
     def partial(template, locals = {})
       slim template, :layout => false, :locals => locals
     end
+
+    def get_bildungsgang(fachklasse)
+      a=fachklasse.split("-")
+      STATKUE[:Fachklasse].where(Flag: a.shift[0], FKS: a.shift, AP: a.shift).first[:Beschreibung_MW]
+    end
+
+    def import_daten
+      # Dir[File.dirname(__FILE__)+"/views/*"]
+      files = Dir["/home/zorro/temp/schild-docker/shared/*"]
+        .reject{|f| File.directory?(f) || !f[".dat"]}
+      files.insert(0, files.delete(files.select{|f|f.include? 'SchuelerBasisdaten'}.join))
+    end
   end
 end
 
@@ -103,7 +137,7 @@ class BewerbungApp < BasisApp
       entries << Module.const_get(k.chomp(".dat")).new(params[k])
     end
     keys.flatten!
-      # binding.pry
+    # binding.pry
     if keys.empty?
       entries.each do |e|
         e[:Vorname]     = t.schueler[:"Vorname"]
@@ -120,3 +154,58 @@ class BewerbungApp < BasisApp
     end
   end
 end
+
+class BewerbungAdminApp < BasisApp
+  configure do
+    if ENV['S_AUTH'] != "false"
+      use Rack::Auth::Basic, "Bitte anmelden" do |username, password|
+        username == "test" && password == "test"
+      end
+    end
+  end
+
+  get '/out' do
+    book = Spreadsheet::Workbook.new
+    bewerber = Tracker.all
+    bewerber.group_by{|b| b[:bildungsgang]}.each_pair do |key,value|
+      sheet = book.create_worksheet :name => key.tr('[]*?:/\\','_')
+      sheet.row(0).concat (%w{Name Vorname	m/w	Geb.-Dat Geb.-Ort Straße\ und\ Hausnr. PLZ\ Wohnort Telefon Mail})
+      value.each_with_index do |v,i|
+        sheet.update_row i+1, v.schueler[:Nachname],
+          v.schueler[:Vorname],
+          v.schueler.Geschlecht,
+          v.schueler.Geburtsdatum,
+          v.zusatzdaten.Geburtsort,
+          v.schueler.Straße,
+          v.schueler.PLZ+" "+v.schueler.Ort,
+          v.zusatzdaten[:"Telefon-Nr."],
+          v.zusatzdaten[:"E-Mail"]
+      end
+    end
+    book.write 'out.xls'
+    file = File.path('out.xls')
+    send_file(file, :disposition => 'attachment')
+  end
+
+  get '/in' do
+    import_daten.each do |f|
+      p f
+      csv=CSV.read(f, {col_sep: "|", headers: true, encoding: "bom|utf-8"})
+      csv.each do |row|
+        Module.const_get(File.basename(f).chomp(".dat")).create(row)
+      end
+    end
+    SchuelerBasisdaten.each do |s|
+      if s.tracker.nil?
+        t =Tracker.create(schueler_basisdaten_id: s.id,
+                       schueler_zusatzdaten_id: SchuelerZusatzdaten.where(Vorname: s.Vorname, Nachname: s.Nachname).first.id,
+                       schueler_erzieher_id: SchuelerErzieher.where(Vorname: s.Vorname, Nachname: s.Nachname).first.id,
+                       # schueler_telefonnummern_id: SchuelerTelefonnummern.where(Vorname: s.Vorname, Nachname: s.Nachname).all.map{|t|t.id},
+                       valid: true,
+                       bildungsgang: get_bildungsgang(s.Fachklasse))
+        SchuelerTelefonnummern.where(Vorname: s.Vorname, Nachname: s.Nachname).each{|fon| fon.tracker_id = t.id}
+      end
+    end
+    "alles drin"
+  end
+end

+ 6 - 1
config.ru

@@ -1,2 +1,7 @@
 require './bewerbung'
-run BewerbungApp
+map '/' do
+  run BewerbungApp
+end
+map '/admin' do
+  run BewerbungAdminApp
+end