2
0

news_info.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. # -*- coding: utf-8 -*-
  2. from odoo import models, fields, api
  3. from datetime import datetime, timedelta
  4. from pymongo import MongoClient
  5. import smtplib
  6. from email.mime.text import MIMEText
  7. from email.header import Header
  8. from odoo.exceptions import UserError
  9. class News(models.Model):
  10. _name = 'news.info'
  11. _description = 'News Info'
  12. _order = 'create_datetime DESC'
  13. name = fields.Char(string='Title', required=True)
  14. context = fields.Text(string='Context')
  15. context_simple = fields.Char(string='Context Simple', compute='_compute_context')
  16. source_url = fields.Char(string='Source URL')
  17. link = fields.Char(string='Link')
  18. article_type = fields.Char(string='Article Type')
  19. article_source = fields.Char(string='Article Source')
  20. img_url = fields.Char(string='Image URL')
  21. keyword = fields.Char(string='Keyword')
  22. posted_date = fields.Char(string='Posted Date')
  23. create_time_ts = fields.Float(string='Creation Time TS')
  24. create_time = fields.Datetime(string='Creation Time')
  25. create_datetime = fields.Datetime(string='Creation Datetime')
  26. def _compute_context(self):
  27. context = ''
  28. for record in self:
  29. if record.context:
  30. if len(record.context) < 80:
  31. record.context_simple = record.context
  32. else:
  33. record.context_simple = f'{record.context[:80]}...'
  34. else:
  35. record.context_simple = context
  36. class SearchKeys(models.Model):
  37. _name = 'news.search_keys'
  38. _description = 'News Search Keys'
  39. _order = 'id DESC'
  40. def _default_name(self):
  41. search_keys_id = self.env['news.search_keys'].search([], limit=1, order='id DESC')
  42. if search_keys_id:
  43. return str(int(search_keys_id.name) + 1).zfill(5)
  44. else:
  45. return '1'.zfill(5)
  46. name = fields.Char(string='Name', default=_default_name)
  47. keys = fields.Char(string='Keys')
  48. text = fields.Text(string='Text')
  49. auto_send = fields.Boolean(string='Auto Send', default=True)
  50. search_days = fields.Integer(string='Search Days', default=7, required=False)
  51. def btn_search(self):
  52. try:
  53. client = MongoClient('mongodb://root:aaaAAA111!!!@erhe.top:38000/', connectTimeoutMS=30000,
  54. serverSelectionTimeoutMS=5000)
  55. # 指定数据库名称
  56. db_name = 'NEWS' # 替换为你的数据库名称
  57. # 选择数据库
  58. db = client[db_name]
  59. # 列出数据库中的所有集合
  60. collections = db.list_collection_names()
  61. except Exception as e:
  62. raise UserError(e)
  63. all_data = []
  64. search_days = 7 # 假设你想搜索最近7天的数据
  65. # 计算日期范围
  66. current_date = datetime.utcnow()
  67. date_threshold = (current_date - timedelta(days=self.search_days)).strftime('%Y-%m-%d %H:%M:%S')
  68. # 将 self.keys 字符串分割成列表,如果 self.keys 为空,则设置为空列表
  69. keys_list = self.keys.split('|||') if self.keys else []
  70. for collection_name in collections:
  71. # 选择集合
  72. collection = db[collection_name]
  73. # 构建查询条件
  74. query_conditions = {'create_time': {'$gte': date_threshold}}
  75. # 如果有传入关键词,添加到查询条件中
  76. if keys_list:
  77. for search_key in keys_list:
  78. # 构建查询
  79. query = {
  80. '$or': [
  81. {'title': {'$regex': search_key, '$options': 'i'}}, # 搜索title字段
  82. {'context': {'$regex': search_key, '$options': 'i'}} # 搜索context字段
  83. ],
  84. 'create_datetime': {'$gte': date_threshold} # create_datetime字段大于等于计算出的日期
  85. }
  86. # 执行查询
  87. results = collection.find(query, {'_id': 0})
  88. for result in results:
  89. all_data.append(result)
  90. else:
  91. query = {'create_datetime': {'$gte': date_threshold}}
  92. results = collection.find(query, {'_id': 0})
  93. for result in results:
  94. all_data.append(result)
  95. sorted_data = []
  96. if all_data:
  97. sorted_data = sorted(all_data, key=lambda x: x['create_time'], reverse=True)
  98. else:
  99. return
  100. if sorted_data:
  101. if self.search_days:
  102. t = '关键词: {}\n{} 天内数据\n{}\n\n'.format(self.keys, self.search_days, '*' * 100)
  103. t = '{} 天内数据\n{}\n\n'.format(self.search_days, '*' * 100)
  104. for d in sorted_data:
  105. title = d.setdefault('title')
  106. context = d.setdefault('context') or '/'
  107. link = d.setdefault('link') or '/'
  108. posted_date = d.setdefault('posted_date') or '/'
  109. create_datetime = d.setdefault('create_datetime')
  110. if len(context) > 300:
  111. context = context[:300] + '...'
  112. t += f"标题: {title}\n内容: {context}\n链接: {link}\n发表时间: {posted_date}\n获取时间: {create_datetime}\n"
  113. t += '*' * 100 + '\n\n'
  114. self.write({'text': t})
  115. else:
  116. self.write({'text': 'No Data'})
  117. if self.auto_send:
  118. self.btn_send_email()
  119. def btn_send_email(self):
  120. if self.text:
  121. mail_host = 'smtp.163.com'
  122. mail_user = 'pushmessagebot@163.com'
  123. mail_pass = 'WSMSRKBKXIHIQWTU'
  124. sender = 'pushmessagebot@163.com'
  125. receivers = ['pushmessagebot@163.com']
  126. message = MIMEText(self.text, 'plain', 'utf-8')
  127. message['From'] = Header(f'keyword: {self.keys}' if self.keys else f'{self.search_days}天内数据', 'utf-8')
  128. message['To'] = Header("SearchAndSend", 'utf-8')
  129. message['Subject'] = Header(f'keyword: {self.keys}' if self.keys else f'{self.search_days}天内数据',
  130. 'utf-8')
  131. try:
  132. smtp_obj = smtplib.SMTP_SSL(mail_host)
  133. smtp_obj.login(mail_user, mail_pass)
  134. smtp_obj.sendmail(sender, receivers, message.as_string())
  135. print("邮件发送成功")
  136. except smtplib.SMTPException as e:
  137. print("Error: 无法发送邮件", e)
  138. else:
  139. raise UserError('请先搜索数据')