# HG changeset patch # User Tomas Zeman # Date 1334903183 -7200 # Node ID a35a0edf9ddd9fbdd3dd4acbc120150f7482fe36 # Parent 90a44ee46732118c36a41a520ec8ee230e894f39 Geo+Company record refactoring diff -r 90a44ee46732 -r a35a0edf9ddd db/db-schema.sql --- a/db/db-schema.sql Fri Apr 20 08:26:22 2012 +0200 +++ b/db/db-schema.sql Fri Apr 20 08:26:23 2012 +0200 @@ -60,15 +60,21 @@ "created_by" bigint, "updated_by" bigint ); -create sequence "s_city_id"; +create sequence "city_id_seq"; create table "address" ( + "city_id" bigint not null, + "name" varchar(100) not null, + "updated_at" timestamp not null, "id" bigint primary key not null, - "city_id" bigint not null, "zip_code" varchar(100) not null, "street_name" varchar(100) not null, - "street_num" varchar(100) not null + "note" varchar(10240), + "created_at" timestamp not null, + "created_by" bigint, + "street_num" varchar(100) not null, + "updated_by" bigint ); -create sequence "s_address_id"; +create sequence "address_id_seq"; create table "country" ( "iso3" varchar(3) not null, "name" varchar(100) not null, @@ -80,7 +86,7 @@ "created_by" bigint, "updated_by" bigint ); -create sequence "s_country_id"; +create sequence "country_id_seq"; create table "contact" ( "name" varchar(100) not null, "updated_at" timestamp not null, @@ -105,32 +111,38 @@ create sequence "contact_id_seq"; create table "company" ( "name" varchar(100) not null, + "dic" varchar(40) not null, "updated_at" timestamp not null, "id" bigint primary key not null, - "partner" integer not null, "ico" varchar(40) not null, "note" varchar(10240), "created_at" timestamp not null, "created_by" bigint, - "corresp_address_id" bigint, + "address_id" bigint not null, + "post_adress_id" bigint, "updated_by" bigint, - "pin" integer not null, - "address_id" bigint not null + "pin" integer not null ); -create sequence "s_company_id"; +create sequence "company_id_seq"; create table "bank_account" ( "number" bigint not null, + "name" varchar(100) not null, + "updated_at" timestamp not null, "id" bigint primary key not null, "prefix" bigint not null, "bank_code" varchar(100) not null, - "company_id" bigint not null + "company_id" bigint not null, + "note" varchar(10240), + "created_at" timestamp not null, + "created_by" bigint, + "updated_by" bigint ); -create sequence "s_bank_account_id"; +create sequence "bank_account_id_seq"; -- foreign key constraints : alter table "address" add constraint "addressFK1" foreign key ("city_id") references "city"("id"); alter table "city" add constraint "cityFK2" foreign key ("country_id") references "country"("id"); alter table "company" add constraint "companyFK3" foreign key ("address_id") references "address"("id"); -alter table "company" add constraint "companyFK4" foreign key ("corresp_address_id") references "address"("id"); -alter table "bank_account" add constraint "bank_accountFK5" foreign key ("company_id") references "company"("id"); +alter table "company" add constraint "companyFK4" foreign key ("post_adress_id") references "address"("id"); +alter table "bank_account" add constraint "bank_accountFK5" foreign key ("company_id") references "company"("id") on delete cascade; -- column group indexes : create index "user_deleted_active_idx" on "user" ("deleted","active"); diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/crm/model/BankAccount.scala --- a/src/main/scala/fis/crm/model/BankAccount.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/crm/model/BankAccount.scala Fri Apr 20 08:26:23 2012 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2011 Tomas Zeman + * Copyright 2011-2012 Tomas Zeman * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,24 +15,23 @@ */ package fis.crm.model +import fis.base.model.Entity import net.liftweb.record.{MetaRecord, Record} import net.liftweb.record.field._ import net.liftweb.squerylrecord.KeyedRecord +import net.tz.lift.model.{FieldLabel => FL} import org.squeryl.annotations.Column -class BankAccount private() extends Record[BankAccount] with KeyedRecord[Long] { +class BankAccount private() extends Record[BankAccount] with Entity[BankAccount] +{ def meta = BankAccount - @Column(name="id") - val idField = new LongField(this) - val prefix = new LongField(this) val number = new LongField(this) val bankCode = new StringField(this, "") - val companyId = new LongField(this) - - lazy val company = CrmSchema.companyToBankAccounts.rightStateful(this) + @Column(name="company_id") + val company = new LongField(this) } object BankAccount extends BankAccount with MetaRecord[BankAccount] diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/crm/model/Company.scala --- a/src/main/scala/fis/crm/model/Company.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/crm/model/Company.scala Fri Apr 20 08:26:23 2012 +0200 @@ -15,34 +15,28 @@ */ package fis.crm.model -import fis.base.model.{Entity, MetaEntity} +import fis.base.model.Entity +import fis.geo.model.Address +import net.liftweb.common._ import net.liftweb.record.{MetaRecord, Record} import net.liftweb.record.field._ +import net.liftweb.util._ +import net.tz.lift.model.{FieldLabel => FL, FieldHelp => FH} +import org.squeryl.annotations.Column class Company private() extends Record[Company] with Entity[Company] { def meta = Company - val ico = new StringField(this, 40) - val pin = new IntField(this) - val partner = new EnumField(this, ParterType) - val addressId = new LongField(this) - lazy val address = CrmSchema.companyToAddress.rightStateful(this) - val correspAddressId = new OptionalLongField(this) - lazy val correspAddress = CrmSchema.companyToCorrespAddress.rightStateful(this) - lazy val accounts = CrmSchema.companyToBankAccounts.leftStateful(this) + val ico = new StringField(this, 40) with FL + val dic = new StringField(this, 40) with FL + val pin = new IntField(this) with FL + @Column(name="address_id") + val address = new LongField(this) with FL + @Column(name="post_adress_id") + val postAddress = new OptionalLongField(this) with FL } -object Company extends Company with MetaRecord[Company] with - MetaEntity[Company] { - - def getTable = CrmSchema.companies -} - -object ParterType extends Enumeration { - type PartnerType = Val - val Customer = new Val(1, "Customer") - val Supplier = new Val(2, "Supplier") -} +object Company extends Company with MetaRecord[Company] // vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/crm/model/CrmSchema.scala --- a/src/main/scala/fis/crm/model/CrmSchema.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/crm/model/CrmSchema.scala Fri Apr 20 08:26:23 2012 +0200 @@ -40,18 +40,19 @@ entityContacts).via((cli, ec) => cli.id === ec.typeId) */ - val companies = table[Company]("company") + val companyT = tableWithSeq[Company] - val companyToAddress = oneToManyRelation(addresses, companies). - via((a, c) => c.addressId === a.id) + val companyAddress = oneToManyRelation(addressT, companyT). + via((a, c) => c.address === a.id) - val companyToCorrespAddress = oneToManyRelation(addresses, companies). - via((a, c) => c.correspAddressId === a.id) + val companyPostAddress = oneToManyRelation(addressT, companyT). + via((a, c) => c.postAddress === a.id) - val bankAccounts = table[BankAccount]("bank_account") + val bankAccountT = tableWithSeq[BankAccount] - val companyToBankAccounts = oneToManyRelation(companies, bankAccounts). - via((c, a) => c.id === a.companyId) + val companyBankAccounts = oneToManyRelation(companyT, bankAccountT). + via((c, a) => c.id === a.company) + companyBankAccounts.foreignKeyDeclaration.constrainReference(onDelete cascade) } object CrmSchema extends CrmSchema diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/Address.scala --- a/src/main/scala/fis/geo/model/Address.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/geo/model/Address.scala Fri Apr 20 08:26:23 2012 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2011 Tomas Zeman + * Copyright 2011-2012 Tomas Zeman * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,23 +15,21 @@ */ package fis.geo.model +import fis.base.model.Entity import net.liftweb.record.{MetaRecord, Record} import net.liftweb.record.field._ import net.liftweb.squerylrecord.KeyedRecord +import net.tz.lift.model.{FieldLabel => FL} import org.squeryl.annotations.Column -class Address private() extends Record[Address] with KeyedRecord[Long] { +class Address private() extends Record[Address] with Entity[Address] { def meta = Address - @Column(name="id") - val idField = new LongField(this) - - val streetName = new StringField(this, "") - val streetNum = new StringField(this, "") - val cityId = new LongField(this) - val zipCode = new StringField(this, "") - - lazy val city = GeoSchema.cityToAddresses.rightStateful(this) + val streetName = new StringField(this, "") with FL + val streetNum = new StringField(this, "") with FL + @Column(name="city_id") + val city = new LongField(this) with CityField with FL + val zipCode = new StringField(this, "") with FL } object Address extends Address with MetaRecord[Address] diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/AddressCrud.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/scala/fis/geo/model/AddressCrud.scala Fri Apr 20 08:26:23 2012 +0200 @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Tomas Zeman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package fis.geo.model + +import fis.base.model.RecordCrud + +trait AddressCrud extends RecordCrud[Address] { + val table = GeoSchema.addressT +} + +object AddressCrud extends AddressCrud + +// vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/City.scala --- a/src/main/scala/fis/geo/model/City.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/geo/model/City.scala Fri Apr 20 08:26:23 2012 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2011 Tomas Zeman + * Copyright 2011-2012 Tomas Zeman * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,19 +15,22 @@ */ package fis.geo.model -import fis.base.model.{Entity, MetaEntity} +import fis.base.model.Entity import net.liftweb.record.{MetaRecord, Record} import net.liftweb.record.field._ +import net.liftweb.util._ +import net.tz.lift.model.{FieldLabel => FL} +import org.squeryl.annotations.Column class City private() extends Record[City] with Entity[City] { def meta = City - val countryId = new LongField(this) - lazy val country = GeoSchema.countryToCities.rightStateful(this) + @Column(name="country_id") + val country = new LongField(this) with CountryField with FL } -object City extends City with MetaRecord[City] with MetaEntity[City] { - def getTable = GeoSchema.cities +object City extends City with MetaRecord[City] with SimpleInjector { + object cities extends Inject[Iterable[City]](() => Nil) } // vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/CityCrud.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/scala/fis/geo/model/CityCrud.scala Fri Apr 20 08:26:23 2012 +0200 @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Tomas Zeman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package fis.geo.model + +import fis.base.model.RecordCrud + +trait CityCrud extends RecordCrud[City] { + val table = GeoSchema.cityT +} + +object CityCrud extends CityCrud + +// vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/CityField.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/scala/fis/geo/model/CityField.scala Fri Apr 20 08:26:23 2012 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright 2012 Tomas Zeman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package fis.geo.model + +import fis.base.model._ +import fis.base.ui.EntityLink +import net.liftweb.common._ +import net.liftweb.util._ + +trait CityField extends SelectField[Long] with Vendor[Box[City]] { + + override def asHtml = (for { + c <- vend + l <- EntityLink(c) + } yield l.asHtml) openOr super.asHtml + + protected def buildDisplayList = + City.cities() map { c => (Full(c.id), c.linkName) } toSeq + + def vend = valueBox flatMap(CityCrud.get _) + def make = Full(vend) + +} + +// vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/Country.scala --- a/src/main/scala/fis/geo/model/Country.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/geo/model/Country.scala Fri Apr 20 08:26:23 2012 +0200 @@ -1,5 +1,5 @@ /* - * Copyright 2011 Tomas Zeman + * Copyright 2011-2012 Tomas Zeman * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,21 +15,23 @@ */ package fis.geo.model -import fis.base.model.{Entity, MetaEntity} +import fis.base.model.Entity +import net.liftweb.common._ import net.liftweb.record.{MetaRecord, Record} import net.liftweb.record.field._ +import net.liftweb.util._ +import net.tz.lift.model.{FieldLabel => FL} class Country private() extends Record[Country] with Entity[Country] { def meta = Country - val iso2 = new StringField(this, 2) - val iso3 = new StringField(this, 3) - lazy val cities = GeoSchema.countryToCities.left(this) + val iso2 = new StringField(this, 2) with FL + val iso3 = new StringField(this, 3) with FL } -object Country extends Country with MetaRecord[Country] with - MetaEntity[Country] { - def getTable = GeoSchema.countries +object Country extends Country with MetaRecord[Country] with + SimpleInjector { + object countries extends Inject[Iterable[Country]](() => Nil) } // vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/CountryCrud.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/scala/fis/geo/model/CountryCrud.scala Fri Apr 20 08:26:23 2012 +0200 @@ -0,0 +1,26 @@ +/* + * Copyright 2012 Tomas Zeman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package fis.geo.model + +import fis.base.model.RecordCrud + +trait CountryCrud extends RecordCrud[Country] { + val table = GeoSchema.countryT +} + +object CountryCrud extends CountryCrud + +// vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/CountryField.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/scala/fis/geo/model/CountryField.scala Fri Apr 20 08:26:23 2012 +0200 @@ -0,0 +1,38 @@ +/* + * Copyright 2012 Tomas Zeman + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package fis.geo.model + +import fis.base.model._ +import fis.base.ui.EntityLink +import net.liftweb.common._ +import net.liftweb.util._ + +trait CountryField extends SelectField[Long] with Vendor[Box[Country]] { + + override def asHtml = (for { + c <- vend + l <- EntityLink(c) + } yield l.asHtml) openOr super.asHtml + + protected def buildDisplayList = + Country.countries() map { c => (Full(c.id), c.linkName) } toSeq + + def vend = valueBox flatMap(CountryCrud.get _) + def make = Full(vend) + +} + +// vim: set ts=2 sw=2 et: diff -r 90a44ee46732 -r a35a0edf9ddd src/main/scala/fis/geo/model/GeoSchema.scala --- a/src/main/scala/fis/geo/model/GeoSchema.scala Fri Apr 20 08:26:22 2012 +0200 +++ b/src/main/scala/fis/geo/model/GeoSchema.scala Fri Apr 20 08:26:23 2012 +0200 @@ -19,15 +19,21 @@ import net.liftweb.squerylrecord.RecordTypeMode._ trait GeoSchema extends BaseSchema { - val cities = table[City]("city") - val addresses = table[Address]("address") - val countries = table[Country]("country") + val cityT = tableWithSeq[City] + val addressT = tableWithSeq[Address] + val countryT = tableWithSeq[Country] + + val cityAddresses = oneToManyRelation(cityT, addressT). + via((c, a) => c.id === a.city) - val cityToAddresses = oneToManyRelation(cities, addresses). - via((c, a) => c.id === a.cityId) + val countryCities = oneToManyRelation(countryT, cityT). + via((country, city) => country.id === city.country) - val countryToCities = oneToManyRelation(countries, cities). - via((country, city) => country.id === city.countryId) + City.cities.default.set { () => from(cityT)( c => + select(c) orderBy(c.name asc)) } + + Country.countries.default.set { () => from(countryT)( c => + select(c) orderBy(c.name asc)) } } object GeoSchema extends GeoSchema