From dc47aadac4a6a9071ead9659a18340ec80f1348b Mon Sep 17 00:00:00 2001 From: Dharmang Soni Date: Fri, 13 Jun 2014 11:42:45 +0530 Subject: [PATCH 1/2] [ADD] one2many issue solved. replaced Idea module with Library for testing relation data from server --- AndroidManifest.xml | 21 ++ libs/odoo-v2.jar | Bin 18295 -> 19104 bytes res/layout/fragment_idea_detail.xml | 19 -- res/layout/fragment_idea_list_item.xml | 16 -- ...fragment_idea.xml => fragment_library.xml} | 8 +- res/layout/fragment_library_custom_view.xml | 21 ++ res/xml/sync_library_data.xml | 6 + src/com/odoo/addons/idea/BooksDB.java | 159 +++++++++++ src/com/odoo/addons/idea/Idea.java | 120 -------- src/com/odoo/addons/idea/IdeaDBHelper.java | 159 ----------- src/com/odoo/addons/idea/IdeaDemoRecords.java | 163 ----------- src/com/odoo/addons/idea/IdeaDetail.java | 58 ---- src/com/odoo/addons/idea/Library.java | 259 ++++++++++++++++++ .../providers/library/LibraryProvider.java | 20 ++ .../addons/idea/services/LibraryService.java | 46 ++++ src/com/odoo/config/ModulesConfig.java | 5 +- src/com/odoo/orm/OEDatabase.java | 21 +- src/com/odoo/orm/OEFieldsHelper.java | 94 +++---- src/com/odoo/orm/OEHelper.java | 63 ++++- src/com/odoo/orm/OEO2MIds.java | 70 +++++ src/com/odoo/orm/OEO2MRecord.java | 12 +- src/com/odoo/orm/SQLHelper.java | 2 - src/com/odoo/util/OEControls.java | 47 ++++ 23 files changed, 779 insertions(+), 610 deletions(-) delete mode 100644 res/layout/fragment_idea_detail.xml delete mode 100644 res/layout/fragment_idea_list_item.xml rename res/layout/{fragment_idea.xml => fragment_library.xml} (65%) create mode 100644 res/layout/fragment_library_custom_view.xml create mode 100644 res/xml/sync_library_data.xml create mode 100644 src/com/odoo/addons/idea/BooksDB.java delete mode 100644 src/com/odoo/addons/idea/Idea.java delete mode 100644 src/com/odoo/addons/idea/IdeaDBHelper.java delete mode 100644 src/com/odoo/addons/idea/IdeaDemoRecords.java delete mode 100644 src/com/odoo/addons/idea/IdeaDetail.java create mode 100644 src/com/odoo/addons/idea/Library.java create mode 100644 src/com/odoo/addons/idea/providers/library/LibraryProvider.java create mode 100644 src/com/odoo/addons/idea/services/LibraryService.java create mode 100644 src/com/odoo/orm/OEO2MIds.java create mode 100644 src/com/odoo/util/OEControls.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6a1ba577..26958deb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -78,6 +78,27 @@ android:name="android.provider.CONTACTS_STRUCTURE" android:resource="@xml/contacts" /> + + + + + + + + + + + \ No newline at end of file diff --git a/libs/odoo-v2.jar b/libs/odoo-v2.jar index 1445d0af84c49be4b5a9af937f9fe8045295e46f..3744e9641c6c1c25777d63810c100ac1c37b8e08 100644 GIT binary patch delta 13098 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 bs>Bx@6?y2tkSrJ&(%+%}w=;^wKfC_|?ZJqH diff --git a/res/layout/fragment_idea_detail.xml b/res/layout/fragment_idea_detail.xml deleted file mode 100644 index e831a9c6..00000000 --- a/res/layout/fragment_idea_detail.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/layout/fragment_idea_list_item.xml b/res/layout/fragment_idea_list_item.xml deleted file mode 100644 index 7b0c4d08..00000000 --- a/res/layout/fragment_idea_list_item.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/layout/fragment_idea.xml b/res/layout/fragment_library.xml similarity index 65% rename from res/layout/fragment_idea.xml rename to res/layout/fragment_library.xml index d02f7bef..9d0cca22 100644 --- a/res/layout/fragment_idea.xml +++ b/res/layout/fragment_library.xml @@ -5,8 +5,14 @@ android:orientation="vertical" android:paddingTop="?android:attr/actionBarSize" > + + diff --git a/res/layout/fragment_library_custom_view.xml b/res/layout/fragment_library_custom_view.xml new file mode 100644 index 00000000..6ad7ee6a --- /dev/null +++ b/res/layout/fragment_library_custom_view.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/res/xml/sync_library_data.xml b/res/xml/sync_library_data.xml new file mode 100644 index 00000000..e2410922 --- /dev/null +++ b/res/xml/sync_library_data.xml @@ -0,0 +1,6 @@ + + diff --git a/src/com/odoo/addons/idea/BooksDB.java b/src/com/odoo/addons/idea/BooksDB.java new file mode 100644 index 00000000..edbb76f3 --- /dev/null +++ b/src/com/odoo/addons/idea/BooksDB.java @@ -0,0 +1,159 @@ +/* + * Odoo, Open Source Management Solution + * Copyright (C) 2012-today Odoo SA () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * + */ + +package com.odoo.addons.idea; + +import java.util.ArrayList; +import java.util.List; + +import android.content.Context; + +import com.odoo.orm.OEColumn; +import com.odoo.orm.OEDatabase; +import com.odoo.orm.OEFields; + +public class BooksDB extends OEDatabase { + + Context mContext = null; + + public BooksDB(Context context) { + super(context); + mContext = context; + } + + @Override + public String getModelName() { + return "book.book"; + } + + @Override + public List getModelColumns() { + List columns = new ArrayList(); + columns.add(new OEColumn("name", "Book Name", OEFields.varchar(100))); + columns.add(new OEColumn("language", "Book Language", OEFields + .varchar(64))); + columns.add(new OEColumn("author_id", "Book Author", OEFields + .manyToOne(new BookAuthor(mContext)))); + columns.add(new OEColumn("student_id", "Book Student", OEFields + .manyToOne(new BookStudent(mContext)))); + columns.add(new OEColumn("category_ids", "Book Categories", OEFields + .manyToMany(new BookCategory(mContext)))); + columns.add(new OEColumn("description", "Book Description", OEFields + .text())); + return columns; + } + + static class BookCategory extends OEDatabase { + + public BookCategory(Context context) { + super(context); + } + + @Override + public String getModelName() { + return "book.category"; + } + + @Override + public List getModelColumns() { + List columns = new ArrayList(); + columns.add(new OEColumn("name", "Category Name", OEFields + .varchar(100))); + columns.add(new OEColumn("description", "Category Description", + OEFields.text())); + return columns; + } + + } + + static class BookAuthor extends OEDatabase { + Context mContext = null; + + public BookAuthor(Context context) { + super(context); + mContext = context; + } + + @Override + public String getModelName() { + return "book.author"; + } + + @Override + public List getModelColumns() { + List columns = new ArrayList(); + columns.add(new OEColumn("name", "Author Name", OEFields + .varchar(100))); + columns.add(new OEColumn("country_id", "Author Country", OEFields + .manyToOne(new ResCountry(mContext)))); + columns.add(new OEColumn("description", "About Author", OEFields + .text())); + return columns; + } + } + + static class ResCountry extends OEDatabase { + + public ResCountry(Context context) { + super(context); + } + + @Override + public String getModelName() { + return "res.country"; + } + + @Override + public List getModelColumns() { + List columns = new ArrayList(); + columns.add(new OEColumn("name", "Country Name", OEFields + .varchar(100))); + return columns; + } + } + + static class BookStudent extends OEDatabase { + Context mContext = null; + + public BookStudent(Context context) { + super(context); + mContext = context; + } + + @Override + public String getModelName() { + return "book.student"; + } + + @Override + public List getModelColumns() { + List columns = new ArrayList(); + columns.add(new OEColumn("name", "Student Name", OEFields + .varchar(100))); + columns.add(new OEColumn("course", "Course Name", OEFields + .varchar(100))); + columns.add(new OEColumn("contact", "Student Contact", OEFields + .varchar(15))); + columns.add(new OEColumn("book_ids", "Assigned Books", OEFields + .oneToMany(new BooksDB(mContext), "student_id"))); + return columns; + } + } + +} diff --git a/src/com/odoo/addons/idea/Idea.java b/src/com/odoo/addons/idea/Idea.java deleted file mode 100644 index 808a6271..00000000 --- a/src/com/odoo/addons/idea/Idea.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Odoo, Open Source Management Solution - * Copyright (C) 2012-today Odoo SA () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * - */ - -package com.odoo.addons.idea; - -import java.util.ArrayList; -import java.util.List; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import com.odoo.R; -import com.odoo.orm.OEDataRow; -import com.odoo.support.BaseFragment; -import com.odoo.support.fragment.FragmentListener; -import com.odoo.util.drawer.DrawerItem; - -/** - * The Class Idea. - */ -public class Idea extends BaseFragment implements OnItemClickListener { - - List mItems = new ArrayList(); - ListView mListView = null; - - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - setHasOptionsMenu(true); - View rootView = inflater.inflate(R.layout.fragment_idea, container, - false); - - if (db().isEmptyTable()) { - IdeaDemoRecords rec = new IdeaDemoRecords(getActivity()); - rec.createDemoRecords(); - } - - mItems.clear(); - for (OEDataRow row : db().select()) { - mItems.add(row.getString("name")); - } - - mListView = (ListView) rootView.findViewById(R.id.listview); - mListView.setAdapter(new ArrayAdapter(getActivity(), - R.layout.fragment_idea_list_item, mItems) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View mView = convertView; - if (mView == null) - mView = getActivity().getLayoutInflater().inflate( - R.layout.fragment_idea_list_item, parent, false); - TextView txv = (TextView) mView.findViewById(R.id.txvIdeaName); - txv.setText(mItems.get(position)); - return mView; - } - - }); - mListView.setOnItemClickListener(this); - return rootView; - } - - @Override - public Object databaseHelper(Context context) { - return new IdeaDBHelper(context); - } - - @Override - public List drawerMenus(Context context) { - List menu = new ArrayList(); - menu.add(new DrawerItem("idea_home", "Idea", true)); - Idea idea = new Idea(); - Bundle args = new Bundle(); - args.putString("key", "idea"); - idea.setArguments(args); - menu.add(new DrawerItem("idea_home", "Idea", 5, 0, idea)); - return menu; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.menu_fragment_account, menu); - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, - long id) { - view.setSelected(true); - IdeaDetail detail = new IdeaDetail(); - Bundle args = new Bundle(); - args.putString("name", mItems.get(position)); - detail.setArguments(args); - FragmentListener frag = (FragmentListener) getActivity(); - frag.startDetailFragment(detail); - } -} diff --git a/src/com/odoo/addons/idea/IdeaDBHelper.java b/src/com/odoo/addons/idea/IdeaDBHelper.java deleted file mode 100644 index 077f6a83..00000000 --- a/src/com/odoo/addons/idea/IdeaDBHelper.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Odoo, Open Source Management Solution - * Copyright (C) 2012-today Odoo SA () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * - */ - -package com.odoo.addons.idea; - -import java.util.ArrayList; -import java.util.List; - -import android.content.Context; - -import com.odoo.orm.OEColumn; -import com.odoo.orm.OEDBHelper; -import com.odoo.orm.OEDatabase; -import com.odoo.orm.OEFields; - -public class IdeaDBHelper extends OEDatabase { - Context mContext = null; - - public IdeaDBHelper(Context context) { - super(context); - mContext = context; - } - - class IdeaCategory extends OEDatabase implements OEDBHelper { - Context mContext = null; - - public IdeaCategory(Context context) { - super(context); - mContext = context; - - } - - @Override - public String getModelName() { - return "idea.category"; - } - - @Override - public List getModelColumns() { - List cols = new ArrayList(); - cols.add(new OEColumn("name", "Name", OEFields.varchar(50))); - return cols; - } - - } - - class IdeaUsers extends OEDatabase implements OEDBHelper { - Context mContext = null; - - public IdeaUsers(Context context) { - super(context); - mContext = context; - } - - @Override - public String getModelName() { - return "idea.users"; - } - - @Override - public List getModelColumns() { - List cols = new ArrayList(); - cols.add(new OEColumn("name", "Name", OEFields.varchar(50))); - cols.add(new OEColumn("city", "city", OEFields.varchar(50))); - cols.add(new OEColumn("user_type", "Type", OEFields - .manyToOne(new IdeaUserType(mContext)))); - return cols; - } - - } - - class IdeaUserType extends OEDatabase implements OEDBHelper { - Context mContext = null; - - public IdeaUserType(Context context) { - super(context); - mContext = context; - } - - @Override - public String getModelName() { - return "idea.user.type"; - } - - @Override - public List getModelColumns() { - List cols = new ArrayList(); - cols.add(new OEColumn("type", "Name", OEFields.varchar(50))); - return cols; - } - - } - - @Override - public String getModelName() { - return "idea.idea"; - } - - @Override - public List getModelColumns() { - List columns = new ArrayList(); - - columns.add(new OEColumn("name", "Name", OEFields.varchar(64))); - columns.add(new OEColumn("description", "Description", OEFields.text())); - columns.add(new OEColumn("category_id", "Idea Category", OEFields - .manyToOne(new IdeaCategory(mContext)))); - columns.add(new OEColumn("user_ids", "Idea Users", OEFields - .manyToMany(new IdeaUsers(mContext)))); - columns.add(new OEColumn("idea_files", "idea_files", OEFields - .oneToMany(new IdeaFiles(mContext), "idea_idea_id"))); - columns.add(new OEColumn("create_date_time", "Current Date time", - OEFields.timestamp("MM/dd/yyyy hh:mm a"))); - columns.add(new OEColumn("flag", "boolean flag", OEFields.booleantype())); - columns.add(new OEColumn("date", "date", OEFields - .datetime("MM/dd/yyyy hh:mm a"))); - columns.add(new OEColumn("real_value", "Real Value", OEFields.real(20))); - return columns; - } - - class IdeaFiles extends OEDatabase { - Context mContext = null; - - public IdeaFiles(Context context) { - super(context); - mContext = context; - } - - @Override - public String getModelName() { - return "idea.files"; - } - - @Override - public List getModelColumns() { - List cols = new ArrayList(); - cols.add(new OEColumn("name", "name", OEFields.varchar(55))); - cols.add(new OEColumn("idea_idea_id", "idea id", OEFields - .manyToOne(new IdeaDBHelper(mContext)))); - return cols; - } - - } -} diff --git a/src/com/odoo/addons/idea/IdeaDemoRecords.java b/src/com/odoo/addons/idea/IdeaDemoRecords.java deleted file mode 100644 index 412bb43e..00000000 --- a/src/com/odoo/addons/idea/IdeaDemoRecords.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Odoo, Open Source Management Solution - * Copyright (C) 2012-today Odoo SA () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * - */ -package com.odoo.addons.idea; - -import java.util.Arrays; -import java.util.List; -import java.util.TimeZone; - -import android.content.Context; -import android.util.Log; - -import com.odoo.orm.OEDataRow; -import com.odoo.orm.OEM2MIds; -import com.odoo.orm.OEM2MIds.Operation; -import com.odoo.orm.OEValues; -import com.odoo.util.OEDate; -import com.odoo.util.logger.OELog; - -public class IdeaDemoRecords { - IdeaDBHelper ideaDb = null; - Context mContext = null; - - public IdeaDemoRecords(Context context) { - mContext = context; - ideaDb = new IdeaDBHelper(mContext); - } - - public void createDemoRecords() { - createIdeaUserTypes(); - createIdeaUsers(); - createIdeaCategory(); - createIdea(); - createIdeaFiles(); - int count = updateRecords(); - OELog.log("Row updated : " + count); - } - - private void createIdeaUserTypes() { - IdeaDBHelper.IdeaUserType userType = ideaDb.new IdeaUserType(mContext); - userType.truncateTable(); - for (int i = 1; i <= 3; i++) { - OEValues values = new OEValues(); - values.put("id", i); - values.put("type", "Type " + i); - long newId = userType.create(values); - Log.d("IdeaDemoRecords", newId - + " Record created for idea.user.type"); - } - } - - private void createIdeaUsers() { - IdeaDBHelper.IdeaUsers ideaUsers = ideaDb.new IdeaUsers(mContext); - ideaUsers.truncateTable(); - for (int i = 1; i <= 5; i++) { - OEValues values = new OEValues(); - values.put("id", i); - values.put("name", "User " + i); - values.put("city", "City " + i); - values.put("user_type", i); // many to one field - long newId = ideaUsers.create(values); - Log.d("IdeaDemoRecords", newId + " Record created for idea.users"); - } - } - - private void createIdeaCategory() { - IdeaDBHelper.IdeaCategory ideaCategory = ideaDb.new IdeaCategory( - mContext); - ideaCategory.truncateTable(); - for (int i = 1; i <= 3; i++) { - OEValues values = new OEValues(); - values.put("id", i); - values.put("name", "Category " + i); - long newId = ideaCategory.create(values); - Log.d("IdeaDemoRecords", newId - + " Record created for idea.category"); - } - } - - private void createIdea() { - ideaDb.truncateTable(); - for (int i = 1; i <= 3; i++) { - OEValues values = new OEValues(); - values.put("id", i); - values.put("name", "Idea " + i); - values.put("description", "Description " + i); - values.put("category_id", i); - values.put("date", "2014-04-15 03:09:44"); - values.put("flag", true); - values.put("real_value", 20.5); - - Integer[] ids = new Integer[] { 1, 2 }; - List user_ids = Arrays.asList(ids); - values.put("user_ids", user_ids); - long newId = ideaDb.create(values); - Log.d("IdeaDemoRecords", newId + " Record created for idea.idea"); - } - } - - private void createIdeaFiles() { - IdeaDBHelper.IdeaFiles ideaFiles = ideaDb.new IdeaFiles(mContext); - for (int i = 1; i <= 2; i++) { - OEValues vals = new OEValues(); - vals.put("id", i); - vals.put("idea_idea_id", i + 1); - vals.put("name", "idea file " + i); - long newId = ideaFiles.create(vals); - Log.d("IdeaDemoRecords", newId + " Record created for idea.files"); - } - } - - public void selectAll() { - for (OEDataRow row : ideaDb.select()) { - OELog.log("RECORD :::::::::::::::::::::::: " + row.getString("id")); - OELog.log("name : " + row.getString("name")); - OELog.log("date", row.getString("date")); - OELog.log("cdate", OEDate.getDate(mContext, row.getString("date"), - TimeZone.getDefault().getID())); - OELog.log("create_date_time", row.getString("create_date_time")); - OELog.log("real_value", row.getFloat("real_value").toString()); - OELog.log("category : " - + row.getM2ORecord("category_id").browse() - .getString("name")); - OELog.log("user_ids : " - + row.getM2MRecord("user_ids").browseEach().get(0) - .getM2ORecord("user_type").browse() - .getString("type")); - for (OEDataRow file : row.getO2MRecord("idea_files").browseEach()) { - OELog.log("idea_files:" + file.getString("name")); - OELog.log("idea_idea_id:" - + file.getM2ORecord("idea_idea_id").browse() - .getString("id")); - } - } - } - - public int updateRecords() { - int count = 0; - OEValues values = new OEValues(); - values.put("description", "Updated Description"); - values.put("category_id", 3); - Integer[] ids = new Integer[] { 3, 4 }; - List user_ids = Arrays.asList(ids); - values.put("user_ids", new OEM2MIds(Operation.APPEND, user_ids)); - count = ideaDb.update(values, "id = ?", new String[] { "2" }); - return count; - } -} \ No newline at end of file diff --git a/src/com/odoo/addons/idea/IdeaDetail.java b/src/com/odoo/addons/idea/IdeaDetail.java deleted file mode 100644 index f97ff84a..00000000 --- a/src/com/odoo/addons/idea/IdeaDetail.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Odoo, Open Source Management Solution - * Copyright (C) 2012-today Odoo SA () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * - */ -package com.odoo.addons.idea; - -import java.util.List; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.odoo.R; -import com.odoo.support.BaseFragment; -import com.odoo.util.drawer.DrawerItem; - -public class IdeaDetail extends BaseFragment { - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View mView = inflater.inflate(R.layout.fragment_idea_detail, container, - false); - Bundle args = getArguments(); - TextView txv = (TextView) mView.findViewById(R.id.textView1); - if (args != null && args.containsKey("name")) - txv.setText(args.getString("name")); - return mView; - } - - @Override - public Object databaseHelper(Context context) { - return new IdeaDBHelper(context); - } - - @Override - public List drawerMenus(Context context) { - return null; - } - -} diff --git a/src/com/odoo/addons/idea/Library.java b/src/com/odoo/addons/idea/Library.java new file mode 100644 index 00000000..25cff25b --- /dev/null +++ b/src/com/odoo/addons/idea/Library.java @@ -0,0 +1,259 @@ +/* + * Odoo, Open Source Management Solution + * Copyright (C) 2012-today Odoo SA () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * + */ + +package com.odoo.addons.idea; + +import java.util.ArrayList; +import java.util.List; + +import android.content.Context; +import android.content.IntentFilter; +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; + +import com.odoo.R; +import com.odoo.addons.idea.BooksDB.BookAuthor; +import com.odoo.addons.idea.BooksDB.BookCategory; +import com.odoo.addons.idea.BooksDB.BookStudent; +import com.odoo.addons.idea.providers.library.LibraryProvider; +import com.odoo.orm.OEDataRow; +import com.odoo.receivers.SyncFinishReceiver; +import com.odoo.support.AppScope; +import com.odoo.support.BaseFragment; +import com.odoo.support.listview.OEListAdapter; +import com.odoo.util.OEControls; +import com.odoo.util.drawer.DrawerItem; +import com.openerp.OETouchListener; +import com.openerp.OETouchListener.OnPullListener; + +/** + * The Class Idea. + */ +public class Library extends BaseFragment implements OnPullListener { + + public static final String TAG = Library.class.getSimpleName(); + + enum Keys { + Books, Authors, Students, Category + } + + View mView = null; + ListView mListControl = null; + List mListRecords = new ArrayList(); + OEListAdapter mListAdapter = null; + OETouchListener mTouchListener = null; + DataLoader mDataLoader = null; + Keys mCurrentKey = Keys.Books; + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + setHasOptionsMenu(true); + scope = new AppScope(this); + mView = inflater.inflate(R.layout.fragment_library, container, false); + init(); + return mView; + } + + private void init() { + checkArguments(); + mListControl = (ListView) mView.findViewById(R.id.listRecords); + mListAdapter = new OEListAdapter(getActivity(), + R.layout.fragment_library_custom_view, mListRecords) { + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View mView = convertView; + if (mView == null) { + mView = getActivity().getLayoutInflater().inflate( + getResource(), parent, false); + } + OEDataRow row = (OEDataRow) mListRecords.get(position); + createView(mView, row); + return mView; + } + }; + mTouchListener = scope.main().getTouchAttacher(); + mTouchListener.setPullableView(mListControl, this); + mListControl.setAdapter(mListAdapter); + mDataLoader = new DataLoader(); + mDataLoader.execute(); + } + + class DataLoader extends AsyncTask { + + @Override + protected Void doInBackground(Void... params) { + scope.main().runOnUiThread(new Runnable() { + + @Override + public void run() { + if (db().isEmptyTable()) { + scope.main().requestSync(LibraryProvider.AUTHORITY); + } + mListRecords.clear(); + switch (mCurrentKey) { + case Books: + mListRecords.addAll(db().select()); + break; + case Authors: + BookAuthor author = new BookAuthor(getActivity()); + mListRecords.addAll(author.select()); + break; + case Category: + BookCategory category = new BookCategory(getActivity()); + mListRecords.addAll(category.select()); + break; + case Students: + BookStudent student = new BookStudent(getActivity()); + mListRecords.addAll(student.select()); + break; + } + } + }); + return null; + } + + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + mListAdapter.notifiyDataChange(mListRecords); + OEControls.setGone(mView, R.id.loadingProgress); + } + + } + + private void createView(View mView, OEDataRow row) { + OEControls.setText(mView, R.id.txvName, row.getString("name")); + List values = new ArrayList(); + switch (mCurrentKey) { + case Books: + for (OEDataRow category : row.getM2MRecord("category_ids") + .browseEach()) { + values.add("- " + category.getString("name")); + } + + break; + case Authors: + OEDataRow country = row.getM2ORecord("country_id").browse(); + if (country != null) { + values.add(country.getString("name")); + } + + break; + case Students: + for (OEDataRow book : row.getO2MRecord("book_ids").browseEach()) { + values.add("- " + book.getString("name")); + } + break; + case Category: + } + OEControls.setText(mView, R.id.txvValues, TextUtils.join("\n", values)); + } + + private void checkArguments() { + Bundle arg = getArguments(); + mCurrentKey = Keys.valueOf(arg.getString("library")); + } + + @Override + public Object databaseHelper(Context context) { + return new BooksDB(context); + } + + @Override + public List drawerMenus(Context context) { + List menu = new ArrayList(); + menu.add(new DrawerItem(TAG, "Library", true)); + menu.add(new DrawerItem(TAG, "Books", count(context, Keys.Books), 0, + object(Keys.Books))); + menu.add(new DrawerItem(TAG, "Authors", count(context, Keys.Authors), + 0, object(Keys.Authors))); + menu.add(new DrawerItem(TAG, "Students", count(context, Keys.Students), + 0, object(Keys.Students))); + menu.add(new DrawerItem(TAG, "Book Category", count(context, + Keys.Category), 0, object(Keys.Category))); + return menu; + } + + private int count(Context context, Keys key) { + int count = 0; + switch (key) { + case Authors: + count = new BookAuthor(context).count(); + break; + case Books: + count = new BooksDB(context).count(); + break; + case Category: + count = new BookCategory(context).count(); + break; + case Students: + count = new BookStudent(context).count(); + break; + default: + break; + } + return count; + } + + private Fragment object(Keys value) { + Library library = new Library(); + Bundle args = new Bundle(); + args.putString("library", value.toString()); + library.setArguments(args); + return library; + } + + @Override + public void onPullStarted(View arg0) { + scope.main().requestSync(LibraryProvider.AUTHORITY); + } + + @Override + public void onResume() { + super.onResume(); + scope.main().registerReceiver(mSyncFinishReceiver, + new IntentFilter(SyncFinishReceiver.SYNC_FINISH)); + } + + @Override + public void onPause() { + super.onPause(); + scope.main().unregisterReceiver(mSyncFinishReceiver); + } + + SyncFinishReceiver mSyncFinishReceiver = new SyncFinishReceiver() { + @Override + public void onReceive(Context context, android.content.Intent intent) { + scope.main().refreshDrawer(TAG); + mTouchListener.setPullComplete(); + if (mDataLoader != null) { + mDataLoader.cancel(true); + } + mDataLoader = new DataLoader(); + mDataLoader.execute(); + } + }; + +} diff --git a/src/com/odoo/addons/idea/providers/library/LibraryProvider.java b/src/com/odoo/addons/idea/providers/library/LibraryProvider.java new file mode 100644 index 00000000..bffa5f3f --- /dev/null +++ b/src/com/odoo/addons/idea/providers/library/LibraryProvider.java @@ -0,0 +1,20 @@ +package com.odoo.addons.idea.providers.library; + +import com.odoo.support.provider.OEContentProvider; + +public class LibraryProvider extends OEContentProvider { + + public static String CONTENTURI = "com.odoo.addons.idea.providers.library.LibraryProvider"; + public static String AUTHORITY = "com.odoo.addons.idea.providers.library"; + + @Override + public String authority() { + return AUTHORITY; + } + + @Override + public String contentUri() { + return CONTENTURI; + } + +} diff --git a/src/com/odoo/addons/idea/services/LibraryService.java b/src/com/odoo/addons/idea/services/LibraryService.java new file mode 100644 index 00000000..3af9bf5f --- /dev/null +++ b/src/com/odoo/addons/idea/services/LibraryService.java @@ -0,0 +1,46 @@ +package com.odoo.addons.idea.services; + +import android.accounts.Account; +import android.app.Service; +import android.content.ContentProviderClient; +import android.content.Context; +import android.content.Intent; +import android.content.SyncResult; +import android.os.Bundle; +import android.util.Log; + +import com.odoo.addons.idea.BooksDB; +import com.odoo.auth.OdooAccountManager; +import com.odoo.orm.OEHelper; +import com.odoo.receivers.SyncFinishReceiver; +import com.odoo.support.service.OEService; + +public class LibraryService extends OEService { + + public static final String TAG = LibraryService.class.getSimpleName(); + + @Override + public Service getService() { + return this; + } + + @Override + public void performSync(Context context, Account account, Bundle extras, + String authority, ContentProviderClient provider, + SyncResult syncResult) { + Log.v(TAG, "LibraryService:performSync()"); + try { + Intent intent = new Intent(); + intent.setAction(SyncFinishReceiver.SYNC_FINISH); + BooksDB db = new BooksDB(context); + db.setAccountUser(OdooAccountManager.getAccountDetail(context, + account.name)); + OEHelper oe = db.getOEInstance(); + if (oe != null && oe.syncWithServer(true)) { + context.sendBroadcast(intent); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/odoo/config/ModulesConfig.java b/src/com/odoo/config/ModulesConfig.java index 27c33bc6..2188a045 100644 --- a/src/com/odoo/config/ModulesConfig.java +++ b/src/com/odoo/config/ModulesConfig.java @@ -18,7 +18,7 @@ */ package com.odoo.config; -import com.odoo.addons.idea.Idea; +import com.odoo.addons.idea.Library; import com.odoo.support.Module; import com.odoo.support.ModulesConfigHelper; @@ -32,7 +32,6 @@ public class ModulesConfig extends ModulesConfigHelper { */ public ModulesConfig() { /* application modules */ - - add(new Module("module_idea", "Idea", new Idea(), 0), true); + add(new Module("module_library", "Library", new Library(), 0), true); } } diff --git a/src/com/odoo/orm/OEDatabase.java b/src/com/odoo/orm/OEDatabase.java index c41bc8f1..1e7255fc 100644 --- a/src/com/odoo/orm/OEDatabase.java +++ b/src/com/odoo/orm/OEDatabase.java @@ -214,6 +214,7 @@ private HashMap getContentValues(OEValues values) { HashMap result = new HashMap(); ContentValues cValues = new ContentValues(); List> m2mObjectList = new ArrayList>(); + List> o2mObjectList = new ArrayList>(); List cols = mDBHelper.getModelColumns(); cols.addAll(getDefaultCols()); for (OEColumn col : cols) { @@ -228,6 +229,15 @@ private HashMap getContentValues(OEValues values) { m2mObjectList.add(m2mObjects); continue; } + // FIXME + if (values.get(key) instanceof OEO2MIds) { + HashMap o2mObjects = new HashMap(); + OEDBHelper o2mDb = findFieldModel(key); + o2mObjects.put("o2mObject", o2mDb); + o2mObjects.put("o2mRecordsObj", values.get(key)); + o2mObjectList.add(o2mObjects); + continue; + } cValues.put(key, values.get(key).toString()); } /** @@ -239,6 +249,7 @@ private HashMap getContentValues(OEValues values) { } } result.put("m2mObjects", m2mObjectList); + result.put("o2mObjects", o2mObjectList); result.put("cValues", cValues); return result; } @@ -326,8 +337,14 @@ private boolean hasRecord(String table, String where, String[] whereArgs) { private OEDBHelper findFieldModel(String field) { for (OEColumn col : mDBHelper.getModelColumns()) { if (field.equals(col.getName())) { - OEManyToMany m2m = (OEManyToMany) col.getType(); - return m2m.getDBHelper(); + if (col.getType() instanceof OEOneToMany) { + OEOneToMany m2m = (OEOneToMany) col.getType(); + return m2m.getDBHelper(); + } + if (col.getType() instanceof OEManyToMany) { + OEManyToMany m2m = (OEManyToMany) col.getType(); + return m2m.getDBHelper(); + } } } return null; diff --git a/src/com/odoo/orm/OEFieldsHelper.java b/src/com/odoo/orm/OEFieldsHelper.java index 19055a56..65e9099e 100644 --- a/src/com/odoo/orm/OEFieldsHelper.java +++ b/src/com/odoo/orm/OEFieldsHelper.java @@ -1,21 +1,3 @@ -/* - * Odoo, Open Source Management Solution - * Copyright (C) 2012-today Odoo SA () - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * - */ package com.odoo.orm; import java.util.ArrayList; @@ -31,6 +13,7 @@ import com.odoo.orm.OEM2MIds.Operation; import com.odoo.orm.types.OEManyToMany; import com.odoo.orm.types.OEManyToOne; +import com.odoo.orm.types.OEOneToMany; public class OEFieldsHelper { public static final String TAG = "com.odoo.orm.OEFieldsHelper"; @@ -76,12 +59,11 @@ public void addAll(JSONArray records) { JSONArray m2oRec = new JSONArray( value.toString()); value = m2oRec.get(0); + if ((Integer) value != 0) { OEManyToOne m2o = (OEManyToOne) col .getType(); - OEDatabase db = (OEDatabase) m2o - .getDBHelper(); - mRelRecord.add(db, value); + mRelRecord.add(m2o, value); } else { value = false; } @@ -96,12 +78,22 @@ public void addAll(JSONArray records) { ids); value = mIds; OEManyToMany m2m = (OEManyToMany) col.getType(); - OEDatabase db = (OEDatabase) m2m.getDBHelper(); - mRelRecord.add(db, ids); + mRelRecord.add(m2m, ids); + } + } + if (col.getType() instanceof OEOneToMany) { + if (value instanceof JSONArray) { + JSONArray o2mRec = new JSONArray( + value.toString()); + List ids = getIdsList(o2mRec); + OEO2MIds mIds = new OEO2MIds(Operation.REPLACE, + ids); + OEOneToMany o2m = (OEOneToMany) col.getType(); + mRelRecord.add(o2m, ids); + value = mIds; } } cValue.put(key, value); - } } mValues.add(cValue); @@ -117,11 +109,6 @@ private List getIdsList(JSONArray array) { List ids = new ArrayList(); try { int length = array.length(); - if (length > 50) { - Log.i(TAG, - "Many2Many records more than 50... - Limiting to 50 records only"); - length = 50; - } for (int i = 0; i < length; i++) { if (array.get(i) instanceof JSONArray) ids.add(array.getJSONArray(i).getInt(0)); @@ -164,6 +151,10 @@ public void addAll(List cols) { } } + public void addManyToOneId(Object model, int id) { + + } + public JSONObject get() { return mFields; } @@ -181,9 +172,19 @@ class OERelRecord { private HashMap> _model_ids = new HashMap>(); @SuppressWarnings("unchecked") - public void add(OEDatabase db, Object ids) { + public void add(Object rel_db, Object ids) { + OEDatabase db = null; + if (rel_db instanceof OEManyToMany) { + db = (OEDatabase) ((OEManyToMany) rel_db).getDBHelper(); + } else if (rel_db instanceof OEOneToMany) { + db = (OEDatabase) ((OEOneToMany) rel_db).getDBHelper(); + } else if (rel_db instanceof OEManyToOne) { + db = (OEDatabase) ((OEManyToOne) rel_db).getDBHelper(); + } else { + db = (OEDatabase) rel_db; + } if (!_models.containsKey(db.getModelName())) { - _models.put(db.getModelName(), db); + _models.put(db.getModelName(), rel_db); } List _ids = new ArrayList(); if (ids instanceof List) { @@ -193,8 +194,7 @@ public void add(OEDatabase db, Object ids) { _ids.add(ids); } if (_model_ids.containsKey(db.getModelName())) { - if (!hasValue(_model_ids.get(db.getModelName()), _ids)) - _model_ids.get(db.getModelName()).addAll(_ids); + _model_ids.get(db.getModelName()).addAll(_ids); } else { _model_ids.put(db.getModelName(), _ids); } @@ -204,45 +204,29 @@ public List getAll() { List datas = new ArrayList(); Set keys = _models.keySet(); for (String key : keys) { - OEDatabase db = (OEDatabase) _models.get(key); - datas.add(new OERelationData(db, _model_ids.get(key))); + datas.add(new OERelationData(_models.get(key), _model_ids + .get(key))); } return datas; } - private boolean hasValue(List list, Object value) { - for (Object obj : list) { - if (value instanceof List) { - @SuppressWarnings("unchecked") - List vList = (List) value; - for (Object vV : vList) { - if (vV.toString().equals(obj.toString())) - return true; - } - } else { - if (obj.toString().equals(value.toString())) - return true; - } - } - return false; - } } public class OERelationData { - OEDatabase db; + Object db; List ids; - public OERelationData(OEDatabase db, List ids) { + public OERelationData(Object db, List ids) { super(); this.db = db; this.ids = ids; } - public OEDatabase getDb() { + public Object getDb() { return db; } - public void setDb(OEDatabase db) { + public void setDb(Object db) { this.db = db; } diff --git a/src/com/odoo/orm/OEHelper.java b/src/com/odoo/orm/OEHelper.java index ee9ceafd..8bc45bd6 100644 --- a/src/com/odoo/orm/OEHelper.java +++ b/src/com/odoo/orm/OEHelper.java @@ -34,6 +34,9 @@ import com.odoo.App; import com.odoo.base.ir.Ir_model; import com.odoo.orm.OEFieldsHelper.OERelationData; +import com.odoo.orm.types.OEManyToMany; +import com.odoo.orm.types.OEManyToOne; +import com.odoo.orm.types.OEOneToMany; import com.odoo.support.OEUser; import com.odoo.util.OEDate; import com.odoo.util.PreferenceManager; @@ -51,6 +54,7 @@ public class OEHelper { App mApp = null; boolean withUser = true; boolean mAllowSelfSignedSSL = false; + List mOne2ManyCols = new ArrayList(); public OEHelper(Context context, OEDatabase oeDatabase) { this(context, oeDatabase, false); @@ -99,6 +103,7 @@ public OEHelper(Context context, boolean withUser, } private void init() { + mOne2ManyCols = new ArrayList(); } public OEUser login(String username, String password, String database, @@ -238,8 +243,14 @@ public boolean syncWithServer(boolean twoWay, OEDomain domain, Log.d(TAG, "Model: " + mDatabase.getModelName()); if (mUser != null) Log.d(TAG, "User: " + mUser.getAndroidName()); - OEFieldsHelper fields = new OEFieldsHelper( - mDatabase.getDatabaseColumns()); + List dbCols = mDatabase.getDatabaseColumns(); + List dbFinalList = new ArrayList(); + for (OEColumn col : dbCols) { + if (!mOne2ManyCols.contains(col.getName())) { + dbFinalList.add(col); + } + } + OEFieldsHelper fields = new OEFieldsHelper(dbFinalList); try { if (domain == null) { domain = new OEDomain(); @@ -253,7 +264,6 @@ public boolean syncWithServer(boolean twoWay, OEDomain domain, domain.add("create_date", ">=", OEDate.getDateBefore(data_limit)); } - if (limits == -1) { limits = 50; } @@ -270,16 +280,57 @@ public boolean syncWithServer(boolean twoWay, OEDomain domain, return synced; } + public void setOne2ManyCol(String column) { + mOne2ManyCols.add(column); + } + + public boolean skipOne2Many(String column) { + if (mOne2ManyCols.contains(column)) { + return true; + } + return false; + } + private boolean handleResultArray(OEFieldsHelper fields, JSONArray results, boolean removeLocalIfNotExists) { boolean flag = false; try { fields.addAll(results); - // Handling many2many and many2one records List rel_models = fields.getRelationData(); for (OERelationData rel : rel_models) { - OEHelper oe = rel.getDb().getOEInstance(); - oe.syncWithServer(false, null, rel.getIds(), false, 0, false); + // Handling many2many records + if (rel.getDb() instanceof OEManyToMany) { + Log.v(TAG, "Syncing ManyToMany Records"); + OEManyToMany m2mObj = (OEManyToMany) rel.getDb(); + OEHelper oe = ((OEDatabase) m2mObj.getDBHelper()) + .getOEInstance(); + oe.syncWithServer(false, null, rel.getIds(), false, 0, + false); + + } else if (rel.getDb() instanceof OEManyToOne) { + // Handling many2One records + Log.v(TAG, "Syncing ManyToOne Records"); + OEManyToOne m2oObj = (OEManyToOne) rel.getDb(); + OEHelper oe = ((OEDatabase) m2oObj.getDBHelper()) + .getOEInstance(); + oe.syncWithServer(false, null, rel.getIds(), false, 0, + false); + } else if (rel.getDb() instanceof OEOneToMany) { + Log.v(TAG, "Syncing OneToMany Records"); + OEOneToMany o2mObj = (OEOneToMany) rel.getDb(); + OEHelper oe = ((OEDatabase) o2mObj.getDBHelper()) + .getOEInstance(); + oe.setOne2ManyCol(o2mObj.getColumnName()); + oe.syncWithServer(false, null, rel.getIds(), false, 0, + false); + } else { + Log.v(TAG, "Syncing " + + rel.getDb().getClass().getSimpleName() + + " Records"); + OEHelper oe = ((OEDatabase) rel.getDb()).getOEInstance(); + oe.syncWithServer(false, null, rel.getIds(), false, 0, + false); + } } List result_ids = mDatabase.createORReplace( fields.getValues(), removeLocalIfNotExists); diff --git a/src/com/odoo/orm/OEO2MIds.java b/src/com/odoo/orm/OEO2MIds.java new file mode 100644 index 00000000..faefdacf --- /dev/null +++ b/src/com/odoo/orm/OEO2MIds.java @@ -0,0 +1,70 @@ +/** + * OpenERP, Open Source Management Solution + * Copyright (C) 2012-today OpenERP SA () + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * + */ +package com.odoo.orm; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; + +import com.odoo.orm.OEM2MIds.Operation; + +public class OEO2MIds { + + /** The operation. */ + Operation mOperation = null; + + /** The List ids. */ + private List mIds = new ArrayList(); + + public OEO2MIds(Operation operation, List ids) { + mIds.clear(); + mOperation = operation; + mIds.addAll(ids); + } + + public Operation getOperation() { + return mOperation; + } + + public void setOperation(Operation mOperation) { + this.mOperation = mOperation; + } + + public List getIds() { + return mIds; + } + + public JSONArray getJSONIds() { + JSONArray ids = new JSONArray(); + try { + for (int id : mIds) { + ids.put(id); + } + } catch (Exception e) { + } + return ids; + } + + public void setIds(List ids) { + mIds.clear(); + mIds.addAll(ids); + } + +} diff --git a/src/com/odoo/orm/OEO2MRecord.java b/src/com/odoo/orm/OEO2MRecord.java index deef5a16..5e07f50b 100644 --- a/src/com/odoo/orm/OEO2MRecord.java +++ b/src/com/odoo/orm/OEO2MRecord.java @@ -24,20 +24,20 @@ public class OEO2MRecord { OEColumn mCol = null; - int mId = 0; + int mRecordId = 0; OEDatabase mDatabase = null; public OEO2MRecord(OEDatabase oeDatabase, OEColumn col, int id) { mDatabase = oeDatabase; mCol = col; - mId = id; + mRecordId = id; } public List browseEach() { - OEOneToMany m2o = (OEOneToMany) mCol.getType(); - String column = mDatabase.tableName() + "_id"; - OEDatabase db = (OEDatabase) m2o.getDBHelper(); - return db.select(column + " = ? ", new String[] { mId + "" }); + OEOneToMany o2m = (OEOneToMany) mCol.getType(); + String column = o2m.getColumnName(); + OEDatabase db = (OEDatabase) o2m.getDBHelper(); + return db.select(column + " = ? ", new String[] { mRecordId + "" }); } public OEDataRow browseAt(int index) { diff --git a/src/com/odoo/orm/SQLHelper.java b/src/com/odoo/orm/SQLHelper.java index d669eb39..5d4622c2 100644 --- a/src/com/odoo/orm/SQLHelper.java +++ b/src/com/odoo/orm/SQLHelper.java @@ -27,7 +27,6 @@ import com.odoo.orm.types.OEManyToOne; import com.odoo.orm.types.OEOneToMany; import com.odoo.orm.types.OETypeHelper; -import com.odoo.util.logger.OELog; public class SQLHelper { @@ -95,7 +94,6 @@ public List createTable(OEDBHelper db) { queries.add(sql.toString()); Log.d("SQLHelper", "Table created : " + table); } - OELog.log(mTables.toString()); return queries; } diff --git a/src/com/odoo/util/OEControls.java b/src/com/odoo/util/OEControls.java new file mode 100644 index 00000000..fa996dc8 --- /dev/null +++ b/src/com/odoo/util/OEControls.java @@ -0,0 +1,47 @@ +package com.odoo.util; + +import android.graphics.Bitmap; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +public class OEControls { + + public static void setText(View parent_view, int textview_id, Object value) { + TextView textView = (TextView) parent_view.findViewById(textview_id); + if (value instanceof String || value instanceof CharSequence) + textView.setText(value.toString()); + if (value instanceof Integer) + textView.setText(Integer.parseInt(value.toString())); + } + + public static String getText(View parent_view, int textview_id) { + TextView textView = (TextView) parent_view.findViewById(textview_id); + return textView.getText().toString(); + } + + public static void setImage(View parent_view, int imageview_id, + Bitmap bitmap) { + ImageView imgView = (ImageView) parent_view.findViewById(imageview_id); + imgView.setImageBitmap(bitmap); + } + + public static void setImage(View parent_view, int imageview_id, + int drawable_id) { + ImageView imgView = (ImageView) parent_view.findViewById(imageview_id); + imgView.setImageResource(drawable_id); + } + + public static void setVisible(View parent_view, int resource_id) { + parent_view.findViewById(resource_id).setVisibility(View.VISIBLE); + } + + public static void setInvisible(View parent_view, int resource_id) { + parent_view.findViewById(resource_id).setVisibility(View.INVISIBLE); + } + + public static void setGone(View parent_view, int resource_id) { + parent_view.findViewById(resource_id).setVisibility(View.GONE); + } + +} From 29a108f2b193f14bd873e4c14150d602359ed0b8 Mon Sep 17 00:00:00 2001 From: Dharmang Soni Date: Mon, 16 Jun 2014 18:25:11 +0530 Subject: [PATCH 2/2] [IMP] onetomany record create and update --- src/com/odoo/orm/OEDatabase.java | 45 ++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/com/odoo/orm/OEDatabase.java b/src/com/odoo/orm/OEDatabase.java index 1e7255fc..a09b2eae 100644 --- a/src/com/odoo/orm/OEDatabase.java +++ b/src/com/odoo/orm/OEDatabase.java @@ -145,6 +145,22 @@ public int update(OEValues values, String where, String[] whereArgs) { } } } + if (res.containsKey("o2mObjects")) { + @SuppressWarnings("unchecked") + List> objectList = (List>) res + .get("o2mObjects"); + for (HashMap obj : objectList) { + OEDatabase o2mDb = (OEDatabase) obj.get("o2mObject"); + OEColumn o2mCol = (OEColumn) obj.get("o2mCol"); + OEO2MIds ids = (OEO2MIds) obj.get("o2mRecordsObj"); + OEOneToMany o2m = (OEOneToMany) o2mCol.getType(); + OEValues vals = new OEValues(); + vals.put(o2m.getColumnName(), values.get("id")); + for (int id : ids.getIds()) { + o2mDb.update(vals, id); + } + } + } return count; } @@ -207,6 +223,22 @@ public long create(OEValues values) { obj.get("m2mRecordsObj")); } } + if (res.containsKey("o2mObjects")) { + @SuppressWarnings("unchecked") + List> objectList = (List>) res + .get("o2mObjects"); + for (HashMap obj : objectList) { + OEDatabase o2mDb = (OEDatabase) obj.get("o2mObject"); + OEColumn o2mCol = (OEColumn) obj.get("o2mCol"); + OEO2MIds ids = (OEO2MIds) obj.get("o2mRecordsObj"); + OEOneToMany o2m = (OEOneToMany) o2mCol.getType(); + OEValues vals = new OEValues(); + vals.put(o2m.getColumnName(), newId); + for (int id : ids.getIds()) { + o2mDb.update(vals, id); + } + } + } return newId; } @@ -229,15 +261,19 @@ private HashMap getContentValues(OEValues values) { m2mObjectList.add(m2mObjects); continue; } - // FIXME if (values.get(key) instanceof OEO2MIds) { HashMap o2mObjects = new HashMap(); OEDBHelper o2mDb = findFieldModel(key); o2mObjects.put("o2mObject", o2mDb); + o2mObjects.put("o2mCol", col); o2mObjects.put("o2mRecordsObj", values.get(key)); o2mObjectList.add(o2mObjects); continue; } + if (col.getType() instanceof OEOneToMany) { + continue; + } + cValues.put(key, values.get(key).toString()); } /** @@ -505,8 +541,13 @@ private Object createRowData(OEColumn col, Cursor cr) { String value = cr.getString(cr.getColumnIndex(col.getName())); if (col.getType() instanceof OETimestamp || col.getType() instanceof OEDateTime) { + String date_format = OEDate.DEFAULT_FORMAT; + if (col.getType() instanceof OEDateTime) { + OEDateTime dttime = (OEDateTime) col.getType(); + date_format = dttime.getPattern(); + } value = OEDate.getDate(mContext, value, TimeZone.getDefault() - .getID(), OEDate.DEFAULT_FORMAT); + .getID(), date_format); } return value; }