Browse Source

add options to field metadata

robert2206 8 years ago
parent
commit
b14f9647c3

+ 32 - 11
src/odoo/decorators/field.ts

@@ -1,5 +1,6 @@
 import { getMetadataStorage } from "../utils/metadata-storage";
 import { FieldType, FieldTypes } from "../types/field";
+import { FieldOptions } from "../options/field-options";
 import { OdooFieldMetadata } from "../metadata/field-metadata";
 
 /**
@@ -10,27 +11,34 @@ export function OdooField(): Function;
 /**
  *
  */
-export function OdooField(fieldName: string): Function;
+export function OdooField(type: FieldType): Function;
 
 /**
  *
  */
-export function OdooField(type: FieldType): Function;
+export function OdooField(options: FieldOptions): Function;
 
 /**
  *
  */
-export function OdooField(fieldName: string, type: FieldType);
+export function OdooField(type: FieldType, options: FieldOptions);
 
 /**
  *
  */
-export function OdooField(fieldName?: string, type?: FieldType): Function {
-    return function (object: Object, propertyName: string) {
-        if (!name) {
-            fieldName = propertyName;
-        }
+export function OdooField(typeOrOptions?: FieldType|FieldOptions, options?: FieldOptions): Function {
+
+    let type: FieldType | undefined;
 
+    if (typeof typeOrOptions === "string") {
+        type = <FieldType>typeOrOptions;
+
+    } else if (typeOrOptions) {
+        options = <FieldOptions>typeOrOptions;
+        type = typeOrOptions.type;
+    }
+
+    return function (object: Object, propertyName: string) {
         if (!type) {
             const typeMetadata = Reflect && (Reflect as any).getMetadata ? (Reflect as any).getMetadata("design:type", object, propertyName) : undefined;
             if (typeMetadata) {
@@ -38,11 +46,24 @@ export function OdooField(fieldName?: string, type?: FieldType): Function {
             }
         }
 
+        if (!options) {
+            options = {} as FieldOptions;
+        }
+
+        if (!options.type && type) {
+            options = Object.assign({ type: type } as FieldOptions, options);
+        }
+
+        if (!options.type) {
+            throw new Error("Tipo no definido");
+        }
+
         const args: OdooFieldMetadata = {
             target: object.constructor,
-            fieldName: fieldName
-        }
+            fieldName: propertyName,
+            options: options
+        };
 
         getMetadataStorage().fields.add(args);
-    }
+    };
 }

+ 3 - 2
src/odoo/decorators/model.ts

@@ -4,11 +4,12 @@ import { OdooModelMetadata } from "../metadata/model-metadata";
 /**
  *
  */
-export function OdooModel(modelName: string) {
+export function OdooModel(name: string) {
     return function (target: Function) {
         const args: OdooModelMetadata = {
             target: target,
-            modelName: modelName
+            name: name,
+            document: name.replace(/\./g, "_")
         }
 
         getMetadataStorage().models.add(args);

+ 3 - 0
src/odoo/metadata/field-metadata.ts

@@ -1,5 +1,8 @@
+import { FieldOptions  } from "../options/field-options";
+
 export interface OdooFieldMetadata {
 
     readonly target: Function | string;
     readonly fieldName: string;
+    readonly options: FieldOptions; 
 }

+ 17 - 2
src/odoo/metadata/metadata-storage.ts

@@ -11,7 +11,22 @@ export class MetadataStorage {
     /**
      *
      */
-    getModels(models?: Function[]) {
-        return this.models;
+    getModels(models?: Function[]): Array<any> {
+        const allModelMetadatas = models ? this.models.filterByTargets(models) : this.models;
+
+        return allModelMetadatas.toArray().map(modelMetadata => {
+            return this.mergeWith(allModelMetadatas, modelMetadata);
+        });
+    }
+
+    /**
+     *
+     */
+    protected mergeWith(allModelMetadatas: ModelMetadataCollection<OdooModelMetadata>, model: OdooModelMetadata) {
+        const fields = this.fields.filterByTarget(model.target);
+        return {
+            model: model,
+            fields: fields
+        }
     }
 }

+ 2 - 1
src/odoo/metadata/model-metadata.ts

@@ -1,5 +1,6 @@
 export interface OdooModelMetadata {
 
     readonly target: Function | string;
-    readonly modelName: string;
+    readonly name: string;
+    readonly document: string;
 }

+ 6 - 0
src/odoo/models/customer.ts

@@ -7,4 +7,10 @@ export class Customer {
 
     @OdooField(FieldTypes.CHAR)
     name: string;
+
+    @OdooField(FieldTypes.CHAR)
+    city: string;
+
+    @OdooField(FieldTypes.CHAR)
+    mobile: string;
 }

+ 7 - 0
src/odoo/options/field-options.ts

@@ -0,0 +1,7 @@
+import { FieldType } from "../types/field";
+
+export class FieldOptions {
+
+    readonly name?: string;
+    readonly type?: FieldType
+}

+ 6 - 5
src/pages/home/home.ts

@@ -1,26 +1,27 @@
 import { Component } from '@angular/core';
 import { NavController, NavParams, MenuController } from 'ionic-angular';
-import { getMetadataStorage } from "../../odoo/utils/metadata-storage";
+import { DownloadService } from "../../services/download-service";
 
 @Component({
 	selector: 'page-home',
   	templateUrl: 'home.html'
 })
 export class HomePage {
-  	
-	
 
 	constructor(
 		public navCtrl: NavController,
 		public navParams: NavParams,
-		public menuCtrl: MenuController
+		public menuCtrl: MenuController,
+		public download: DownloadService
 	) { }
 
   	ionViewDidLoad() {
 		console.log('ionViewDidLoad HomePage');
 		this.menuCtrl.enable(true);
 
-		console.log(getMetadataStorage());
+		this.download.do().subscribe(model => { 
+			console.log(model);
 			
+		}, error => console.error(error));	
   	}
 }

+ 26 - 4
src/services/download-service.ts

@@ -2,14 +2,36 @@ import { Injectable } from "@angular/core";
 import { Observable } from "rxjs/Observable";
 import { Observer } from "rxjs/Observer";
 
+import { OdooService } from "./odoo-service";
+
+import { getMetadataStorage } from "../odoo/utils/metadata-storage";
+
+import "rxjs/add/observable/from";
+import "rxjs/add/operator/concatMap";
+
 @Injectable()
 export class DownloadService {
 
-    constructor() { }
+    constructor(
+        public odoo: OdooService
+    ) { }
 
     do(): Observable<any> {
-        return Observable.create((observer: Observer<any>) => { 
-            
-        });
+        return Observable.from(getMetadataStorage().getModels()).concatMap(item => this.odoo.searchRead(item.model.name, [[[]]]));
+    }
+
+    /**
+     *
+     */
+    protected fetch(model: string): Observable<any> {
+        return null;
+    }
+
+    /**
+     *
+     */
+    protected store(model: string): Observable<any> {
+
+        return null;
     }
 }

+ 1 - 1
src/services/odoo-service.ts

@@ -15,7 +15,7 @@ export class OdooService {
      * Example:
      * instance.searchRead('res.partner', [[['is_company', '=', true], ['customer', '=', true]]], { 'fields': ['name', 'comment']})
      */
-    searchRead(model: string, domain: any, fields: any): Observable<any> {
+    searchRead(model: string, domain: any, fields?: any): Observable<any> {
         return Observable.fromPromise(this.odooRPC.searchRead(model, domain, fields));
     }