jack hai 1 ano
pai
achega
eb5c61997c

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.DS_Store

+ 7 - 0
__init__.py

@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers
+from . import security
+from . import models
+from . import views
+from . import wizard

+ 15 - 0
__manifest__.py

@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+{
+    "name": "Auto Module",
+    "version": "1.0",
+    "author": "Jack",
+    "category": "Tools",
+    "depends": ["base"],
+    "data": [
+        "security/ir.model.access.csv",
+        "views/views_news_info.xml",
+        "wizard/views_sync_news_data.xml"
+    ],
+    "installable": True,
+    "auto_install": False,
+}

+ 3 - 0
controllers/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import controllers

BIN=BIN
controllers/__pycache__/__init__.cpython-310.pyc


BIN=BIN
controllers/__pycache__/controllers.cpython-310.pyc


+ 22 - 0
controllers/controllers.py

@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# from odoo import http
+
+
+# class News(http.Controller):
+#     @http.route('/news/news', auth='public')
+#     def index(self, **kw):
+#         return "Hello, world"
+
+#     @http.route('/news/news/objects', auth='public')
+#     def list(self, **kw):
+#         return http.request.render('news.listing', {
+#             'root': '/news/news',
+#             'objects': http.request.env['news.news'].search([]),
+#         })
+
+#     @http.route('/news/news/objects/<model("news.news"):obj>', auth='public')
+#     def object(self, obj, **kw):
+#         return http.request.render('news.object', {
+#             'object': obj
+#         })
+

+ 30 - 0
demo/demo.xml

@@ -0,0 +1,30 @@
+<odoo>
+    <data>
+<!--
+          <record id="object0" model="news.news">
+            <field name="name">Object 0</field>
+            <field name="value">0</field>
+          </record>
+
+          <record id="object1" model="news.news">
+            <field name="name">Object 1</field>
+            <field name="value">10</field>
+          </record>
+
+          <record id="object2" model="news.news">
+            <field name="name">Object 2</field>
+            <field name="value">20</field>
+          </record>
+
+          <record id="object3" model="news.news">
+            <field name="name">Object 3</field>
+            <field name="value">30</field>
+          </record>
+
+          <record id="object4" model="news.news">
+            <field name="name">Object 4</field>
+            <field name="value">40</field>
+          </record>
+-->
+    </data>
+</odoo>

+ 3 - 0
models/__init__.py

@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import news_info

BIN=BIN
models/__pycache__/__init__.cpython-310.pyc


BIN=BIN
models/__pycache__/news_info.cpython-310.pyc


+ 34 - 0
models/news_info.py

@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+from odoo import models, fields, api
+
+
+class News(models.Model):
+    _name = 'news.info'
+    _description = 'News Info'
+    _order = 'create_time_ts DESC'
+
+    name = fields.Char(string='Title', required=True)
+    context = fields.Text(string='Context')
+    context_simple = fields.Char(string='Context Simple', compute='_compute_context')
+    source_url = fields.Char(string='Source URL')
+    link = fields.Char(string='Link')
+    article_type = fields.Char(string='Article Type')
+    article_source = fields.Char(string='Article Source')
+    img_url = fields.Char(string='Image URL')
+    keyword = fields.Char(string='Keyword')
+    posted_date = fields.Char(string='Posted Date')
+    create_time_ts = fields.Float(string='Creation Time TS')
+    create_time = fields.Datetime(string='Creation Time')
+    create_datetime = fields.Datetime(string='Creation Datetime')
+
+    def _compute_context(self):
+        context = ''
+        for record in self:
+            if record.context:
+                if len(record.context) < 80:
+                    record.context_simple = record.context
+                else:
+                    record.context_simple = f'{record.context[:80]}...'
+            else:
+                record.context_simple = context

+ 3 - 0
security/ir.model.access.csv

@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_news_news,news.news,model_news_info,base.group_user,1,1,1,1
+sync_news_data_access,Sync News Data Access,model_auto_news_sync,base.group_user,1,1,1,0

+ 23 - 0
security/security.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <record id="demo_demo_access" model="ir.model.access">
+        <field name="name">Demo Access</field>
+        <field name="model_id" ref="model_news_info"/>
+        <field name="group_id" ref="base.group_user"/>
+        <field name="perm_read" eval="1"/>
+        <field name="perm_write" eval="1"/>
+        <field name="perm_create" eval="1"/>
+        <field name="perm_unlink" eval="1"/>
+    </record>
+
+    <!-- Access Right for Sync News Data -->
+    <record id="sync_news_data_access" model="ir.model.access">
+        <field name="name">Sync News Data Access</field>
+        <field name="model_id" ref="model_auto_news_sync"/>
+        <field name="group_id" ref="base.group_user"/>
+        <field name="perm_read" eval="1"/>
+        <field name="perm_write" eval="1"/>
+        <field name="perm_create" eval="1"/>
+        <field name="perm_unlink" eval="0"/>
+    </record>
+</odoo>

+ 81 - 0
views/views_news_info.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <record id="view_news_tree" model="ir.ui.view">
+        <field name="name">news.info.tree</field>
+        <field name="model">news.info</field>
+        <field name="arch" type="xml">
+            <tree string="News" limit="80" create="0">
+                <field name="name"/>
+                <field name="context_simple"/>
+                <field name="keyword"/>
+                <field name="article_source"/>
+                <field name="article_type"/>
+                <field name="posted_date"/>
+                <field name="create_time"/>
+            </tree>
+        </field>
+    </record>
+
+    <record id="view_news_form" model="ir.ui.view">
+        <field name="name">news.info.form</field>
+        <field name="model">news.info</field>
+        <field name="arch" type="xml">
+            <form string="News" edit="0">
+                <sheet>
+                    <group>
+                        <field name="name"/>
+                        <group>
+                            <field name="keyword"/>
+                            <field name="article_type"/>
+                            <field name="link" widget="url"/>
+                            <field name="create_datetime"/>
+                            <field name="img_url"/>
+                        </group>
+                        <group>
+                            <field name="posted_date"/>
+                            <field name="article_source"/>
+                            <field name="create_time"/>
+                            <field name="source_url" widget="url"/>
+                        </group>
+                        <field name="context"/>
+                    </group>
+                </sheet>
+            </form>
+        </field>
+    </record>
+
+    <record id="view_news_search" model="ir.ui.view">
+        <field name="name">news.info.search</field>
+        <field name="model">news.info</field>
+        <field name="arch" type="xml">
+            <search string="Search News">
+                <group>
+                    <filter string="Title" name="name_filter" domain="[('name', 'ilike', self)]"/>
+                    <filter string="Context" name="context_filter" domain="[('context', 'ilike', self)]"/>
+                    <filter string="Article Source" name="source_filter" domain="[('article_source', 'ilike', self)]"/>
+                    <filter string="Article Type" name="type_filter" domain="[('article_type', 'ilike', self)]"/>
+                    <filter string="Keyword" name="keyword_filter" domain="[('keyword', 'ilike', self)]"/>
+                </group>
+                <!-- 添加一个搜索输入框 -->
+                <field name="name"/>
+                <field name="context"/>
+                <field name="article_source"/>
+                <field name="article_type"/>
+                <field name="keyword"/>
+                <newline/>
+                <!-- 添加一个搜索按钮 -->
+                <group expand="1">
+                    <button name="search" string="Search" type="object" icon="fa-search"/>
+                </group>
+            </search>
+        </field>
+    </record>
+
+    <record id="action_news_info" model="ir.actions.act_window">
+        <field name="name">News Info</field>
+        <field name="res_model">news.info</field>
+        <field name="view_mode">tree,form</field>
+    </record>
+
+    <menuitem id="menu_news" name="News Info" action="action_news_info"/>
+</odoo>

+ 2 - 0
wizard/__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import wizard_sync_news_data

BIN=BIN
wizard/__pycache__/__init__.cpython-310.pyc


BIN=BIN
wizard/__pycache__/wizard_sync_news_data.cpython-310.pyc


+ 31 - 0
wizard/views_sync_news_data.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <record id="view_sync_news_data_wizard" model="ir.ui.view">
+        <field name="name">auto.news.sync.wizard</field>
+        <field name="model">auto.news.sync</field>
+        <field name="arch" type="xml">
+            <form string="Synchronize News Data" version="7.0">
+                <sheet>
+                    <label for="message"/>
+                    <h1><field name="message"/></h1>
+                    <footer>
+                        <button string='Confirm' name="btn_sync_data" type="object" class="btn-primary"/>
+                        <button string="Cancel" class="btn-secondary" special="cancel"/>
+                    </footer>
+                </sheet>
+            </form>
+        </field>
+    </record>
+
+    <!-- Action for Wizard -->
+    <record id="action_sync_news_data_wizard" model="ir.actions.act_window">
+        <field name="name">Synchronize News Data Wizard</field>
+        <field name="res_model">auto.news.sync</field>
+        <field name="view_mode">form</field>
+        <field name="view_id" ref="view_sync_news_data_wizard"/>
+        <field name="target">new</field>
+    </record>
+
+    <!-- Optionally, add a menu item if you want this action to appear in the menu -->
+    <menuitem id="menu_sync_news_data" name="Synchronize News Data" parent="news.menu_news" action="action_sync_news_data_wizard"/>
+</odoo>

+ 64 - 0
wizard/wizard_sync_news_data.py

@@ -0,0 +1,64 @@
+# -*- coding: UTF-8 -*-
+from datetime import datetime
+
+from odoo import models, fields, _
+from pymongo import MongoClient
+
+
+class SyncNewsData(models.TransientModel):
+    _name = 'auto.news.sync'
+    _description = 'Auto News Sync'
+
+    message = fields.Text('Message', default='确认同步数据?', readonly=True)
+
+    def btn_sync_data(self):
+        client = MongoClient('mongodb://root:aaaAAA111!!!@home.erhe.link:38000/')
+
+        # 指定数据库名称
+        db_name = 'NEWS'  # 替换为你的数据库名称
+
+        # 选择数据库
+        db = client[db_name]
+
+        # 列出数据库中的所有集合
+        collections = db.list_collection_names()
+
+        all_data = []
+
+        for collection_name in collections:
+            # 选择集合
+            collection = db[collection_name]
+
+            # 读取集合中的所有数据
+            for document in collection.find({}, {'_id': 0}):
+                all_data.append(document)
+
+        sorted_data = []
+
+        if all_data:
+            sorted_data = sorted(all_data, key=lambda x: x['create_time'], reverse=True)
+
+        for doc in sorted_data:
+            news_data_id = self.env['news.info'].search([('name', '=', doc['title'])], limit=1)
+
+            if news_data_id:
+                continue
+
+            create_time_dt = None
+            if doc.get('create_time'):
+                create_time_dt = datetime.utcfromtimestamp(doc['create_time'])
+
+            news_data = news_data_id.create({
+                'name': doc.get('title'),
+                'context': doc.get('context') or '',
+                'source_url': doc.get('source_url') or '',
+                'link': doc.get('line') or '',
+                'article_type': doc.get('article_type') or '',
+                'article_source': doc.get('article_source') or '',
+                'img_url': doc.get('img_url') or '',
+                'keyword': doc.get('keyword') or '',
+                'posted_date': doc.get('posted_date') or '',
+                'create_time_ts': doc.get('create_time') or '',
+                'create_time': create_time_dt,
+                'create_datetime': datetime.strptime(doc['create_datetime'], '%Y-%m-%d %H:%M:%S')
+            })