瀏覽代碼

移动侦测消息存库,进行分表。新增逻辑实现代码,model新增星期一至星期天设备信息表。

zhangdongming 3 年之前
父節點
當前提交
753fd086cd
共有 4 個文件被更改,包括 408 次插入0 次删除
  1. 29 0
      Controller/DetectControllerV2.py
  2. 218 0
      Model/models.py
  3. 84 0
      Object/utils/LocalDateTimeUtil.py
  4. 77 0
      Service/EquipmentInfoService.py

+ 29 - 0
Controller/DetectControllerV2.py

@@ -34,6 +34,9 @@ import boto3
 from AnsjerPush.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
 import botocore
 from botocore import client
+import datetime
+from Service.EquipmentInfoService import EquipmentInfoService
+from Object.utils import LocalDateTimeUtil
 
 '''
 http://push.dvema.com/notify/push?etk=Y2lTRXhMTjBWS01sWlpURTVJU0ZWTlJ6RXhNVUU9T3o=&n_time=1526845794&channel=1&event_type=704&is_st=0
@@ -162,6 +165,8 @@ class NotificationView(View):
             logger.info('进入手机推送------')
             logger.info('uid={}'.format(uid))
             logger.info(redis_list)
+            new_device_info_list = []
+            local_date_now = str(datetime.datetime.fromtimestamp(int(n_time)).date())
             for up in redis_list:
                 push_type = up['push_type']
                 appBundleId = up['appBundleId']
@@ -210,6 +215,24 @@ class NotificationView(View):
                             storage_location=2,
                             borderCoords='',
                         ))
+                        # start 根据设备侦测时间为准进行分表存储数据
+                        logger.info('分表存数据start------')
+                        new_device_info_list.append(EquipmentInfoService.get_equipment_info_obj(
+                            local_date_now,
+                            device_user_id=userID_id,
+                            event_time=n_time,
+                            event_type=event_type,
+                            device_uid=uid,
+                            device_nick_name=nickname,
+                            channel=channel,
+                            alarm='Motion \tChannel:{channel}'.format(channel=channel),
+                            is_st=is_st,
+                            receive_time=n_time,
+                            add_time=now_time,
+                            storage_location=2,
+                            borderCoords='',
+                        ))
+                        # end
                     userID_ids.append(userID_id)
                 try:
                     # 推送消息
@@ -229,6 +252,12 @@ class NotificationView(View):
                 SysMsgModel.objects.bulk_create(sys_msg_list)
             else:
                 Equipment_Info.objects.bulk_create(eq_list)
+                # new 分表批量存储 设备信息
+                if new_device_info_list and len(new_device_info_list) > 0:
+                    # 根据日期获得星期几
+                    week = LocalDateTimeUtil.date_to_week(local_date_now)
+                    EquipmentInfoService.equipment_info_bulk_create(week, new_device_info_list)
+                    logger.info('设备信息分表批量保存end------')
 
             if is_st == 0 or is_st == 2:
                 for up in redis_list:

+ 218 - 0
Model/models.py

@@ -346,6 +346,224 @@ class Equipment_Info(models.Model):
         ordering = ('-id',)
         app_label = "db2"
 
+
+class EquipmentInfoMonday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_monday'
+        verbose_name = u'星期一设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoTuesday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_tuesday'
+        verbose_name = u'星期二设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoWednesday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_wednesday'
+        verbose_name = u'星期三设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoThursday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_thursday'
+        verbose_name = u'星期四设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoFriday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_friday'
+        verbose_name = u'星期五设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoSaturday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_saturday'
+        verbose_name = u'星期六设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
+class EquipmentInfoSunday(models.Model):
+    id = models.BigAutoField(primary_key=True, verbose_name=u'自增标记ID')
+    device_user_id = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'用户id')
+    device_uid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备uid')
+    device_nick_name = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备昵称')
+    channel = models.IntegerField(default=1, blank=True, verbose_name=u'设备通道')
+    event_type = models.IntegerField(default=0, blank=True,
+                                     verbose_name=u'事件类型(0:代表空字符,1:ai人,2:ai动物,3:车,123:组合类型(人/车/动物),51:移动侦测,'
+                                                  u'52:传感器报警,53:影像遗失,54:PIR,55:门磁报警, 56:外部发报, 57:人型报警,'
+                                                  u'702:摄像头休眠,703:摄像头唤醒,'
+                                                  u'704:电量过低)')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态(0,1)')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    event_time = models.CharField(blank=True, db_index=True, default='', max_length=16, verbose_name=u'设备报警时间')
+    receive_time = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
+    is_st = models.SmallIntegerField(default=0, verbose_name='是否截图(0:否,1:图片,2:视频)')  # 0 否,1 是图,2,视频
+    storage_location = models.SmallIntegerField(default=1, verbose_name='数据信息存储位置。1:阿里云oss,2:aws')
+    border_coords = models.TextField(default='', blank=True, verbose_name=u'ai类型图片边框位置信息')
+    add_time = models.IntegerField(verbose_name='添加时间', db_index=True, default=0)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info_sunday'
+        verbose_name = u'星期天设备信息推送表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db2"
+
+
 class Ai_Push_Info(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     devUid = models.CharField(default='', db_index=True, blank=True, max_length=32, verbose_name=u'设备ID')

+ 84 - 0
Object/utils/LocalDateTimeUtil.py

@@ -0,0 +1,84 @@
+#!/usr/bin/python3.6
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2022 #
+# @Time    : 2022/3/26 16:20
+# @Author  : ming
+# @Email   : zhangdongming@asj6.wecom.work
+# @File    : LocalDateTimeUtil.py
+# @Software: PyCharm
+import datetime
+import time
+
+
+def get_last_first_date_and_last_date(n):
+    """
+    获取前n周开始时间和结束时间,参数n:代表前n周
+    """
+    now = datetime.datetime.now()
+    # 上周第一天和最后一天
+    before_n_week_start = now - datetime.timedelta(days=now.weekday() + 7 * n, hours=now.hour, minutes=now.minute,
+                                                   seconds=now.second, microseconds=now.microsecond)
+    # last_week_end = now - timedelta(days=now.weekday() + 1)
+    before_n_week_end = before_n_week_start + datetime.timedelta(days=6, hours=23, minutes=59, seconds=59)
+    return before_n_week_start, before_n_week_end
+
+
+def get_today_date(timestamp=False):
+    """
+    返回当天开始时间和结束时间
+    Args:
+        timestamp 是否返回时间戳
+    returns:
+        zero_today ,last_today
+    """
+
+    now = datetime.datetime.now()
+    zero_today = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,
+                                          microseconds=now.microsecond)
+    last_today = zero_today + datetime.timedelta(hours=23, minutes=59, seconds=59)
+    if timestamp:
+        zero_today = int(time.mktime(zero_today.timetuple()))
+        last_today = int(time.mktime(last_today.timetuple()))
+        return zero_today, last_today
+    return zero_today, last_today
+
+
+def get_last_month():
+    """
+    获取前一个月时间
+    returns:
+        last_month_date
+    """
+    today = datetime.date.today()  # 1. 获取「今天」
+    last_month = today.replace(month=today.month - 1)  # 2.获取前一个月
+    last_month_date = last_month.strftime("%Y-%m-%d %H:%M:%S")
+    return last_month_date
+
+
+def date_to_week(str_date):
+    """
+    日期获取星期几
+    @param str_date 日期 例:2022-03-03
+    @return: int 1-7
+    """
+    if str_date:
+        return datetime.datetime.strptime(str_date, "%Y-%m-%d").weekday() + 1
+    return datetime.datetime.now().weekday() + 1
+
+
+if __name__ == "__main__":
+    now_time = 1650211200
+    local_date_now = str(datetime.datetime.fromtimestamp(now_time).date())
+    print(now_time)
+    print(local_date_now)
+    week = date_to_week(local_date_now)
+    print(week)
+    dd = datetime.date.today()
+    print(type(dd))
+    dd = str(dd)
+    print(type(dd))
+    week = date_to_week('2022-03-03')
+    print(week)
+    start_time, end_time = get_today_date(True)
+    print('--- start_time = {} end_time = {}'.format(start_time, end_time))

+ 77 - 0
Service/EquipmentInfoService.py

@@ -0,0 +1,77 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : EquipmentInfoService.py
+@Time    : 2022/4/14 17:28
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import logging
+from Model.models import EquipmentInfoMonday, EquipmentInfoTuesday, EquipmentInfoWednesday, EquipmentInfoThursday, \
+    EquipmentInfoFriday, EquipmentInfoSaturday, EquipmentInfoSunday
+from Object.utils import LocalDateTimeUtil
+from django.db import transaction
+
+
+class EquipmentInfoService:
+
+    @staticmethod
+    def get_equipment_info_obj(dt, **kwargs):
+        """
+        根据日期判断是星期几,返回相应的对象实例
+        @param dt: 日期 例:2022-03-03
+        @param kwargs: 设备信息属性值
+        @return: 星期一至星期天equipment_info对象实例
+        """
+        week = LocalDateTimeUtil.date_to_week(dt)
+        equipment_info = None
+        if week == 1:
+            equipment_info = EquipmentInfoMonday(**kwargs)
+        elif week == 2:
+            equipment_info = EquipmentInfoTuesday(**kwargs)
+        elif week == 3:
+            equipment_info = EquipmentInfoWednesday(**kwargs)
+        elif week == 4:
+            equipment_info = EquipmentInfoThursday(**kwargs)
+        elif week == 5:
+            equipment_info = EquipmentInfoFriday(**kwargs)
+        elif week == 6:
+            equipment_info = EquipmentInfoSaturday(**kwargs)
+        elif week == 7:
+            equipment_info = EquipmentInfoSunday(**kwargs)
+        return equipment_info
+
+    @staticmethod
+    def equipment_info_bulk_create(week_val, equipment_info_list):
+        """
+        根据week_val判断,进行表对象选择存储
+        @param week_val: 星期一至星期天,int类型
+        @param equipment_info_list: 设备信息实例列表
+        @return: True or False
+        """
+        try:
+            with transaction.atomic():
+                if equipment_info_list and len(equipment_info_list) > 0:
+                    if week_val == 0:
+                        return False
+                    if week_val == 1:
+                        EquipmentInfoMonday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 2:
+                        EquipmentInfoTuesday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 3:
+                        EquipmentInfoWednesday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 4:
+                        EquipmentInfoThursday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 5:
+                        EquipmentInfoFriday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 6:
+                        EquipmentInfoSaturday.objects.bulk_create(equipment_info_list)
+                    elif week_val == 7:
+                        EquipmentInfoSunday.objects.bulk_create(equipment_info_list)
+                    return True
+                return False
+        except Exception as e:
+            er_log = logging.getLogger('django')
+            er_log.exception(repr(e))
+            er_log.error(repr(e))
+            return False