浏览代码

add possibility to load a template file

nico 8 年之前
父节点
当前提交
3d4cbb30d1

+ 9 - 3
brain.yml

@@ -35,13 +35,19 @@
     neurons:
       - systemdate:
           say_template:
-            - "il est {{ hours }} heures et {{ minutes }} minutes"
-            - "{{ hours }} heures et {{ minutes }} minutes praicizaiman"
-            - "ma montre indique {{ hours }} heures et {{ minutes }} minutes"
+            - "Il est {{ hours }} heures et {{ minutes }} minutes"
           tts: "voxygen"
     when:
       - order: "quelle heure"
 
+  - name: "Say local date from template"
+    neurons:
+      - systemdate:
+          file_template: fr_systemdate_template_example.j2
+          tts: "voxygen"
+    when:
+      - order: "quelle heure 2"
+
   - name: "Close rolling shutter"
     neurons:
       - command: "curl http://192.168.0.22:5000/fermeture -d \"password=monpass\" -X POST"

+ 48 - 9
neurons/Neurone.py

@@ -1,6 +1,7 @@
 import importlib
 from jinja2 import Template
 import random
+import os.path
 
 from core import ConfigurationManager
 
@@ -9,6 +10,14 @@ class NoTemplateException(Exception):
     pass
 
 
+class MultipleTemplateException(Exception):
+    pass
+
+
+class TemplateFileNotFoundException(Exception):
+    pass
+
+
 class Neurone:
     def __init__(self, **kwargs):
         # get the name of the plugin
@@ -31,17 +40,47 @@ class Neurone:
             message = random.choice(message)
 
         # Check if there is a template associate to the output message
-        template = kwargs.get('say_template', None)
+        say_template = kwargs.get('say_template', None)
+        # check if there is a template file associate to the output message
+        file_template = kwargs.get('file_template', None)
+
+        # we check if the user provide a say_template or a file_template, Not both
+        if say_template is not None and file_template is not None:
+            raise MultipleTemplateException("You must provide a say_template or a file_template, not both")
+
+        # check on of the two option is set
         if isinstance(message, dict):
-            if template is not None:
-                if isinstance(template, list):
-                    # then we pick randomly one template
-                    template = random.choice(template)
-                t = Template(template)
-                message = t.render(**message)
+            if (say_template is not None and file_template is None) or \
+                    (say_template is None and file_template is not None):
+                if say_template is not None:    # the user choose a say_template option
+                    if isinstance(say_template, list):
+                        # then we pick randomly one template
+                        say_template = random.choice(say_template)
+                    t = Template(say_template)
+                    message = t.render(**message)
+                if file_template is not None:   # the user choose a file_template option
+                    real_file_template_path = "templates/%s" % file_template
+                    if os.path.isfile(real_file_template_path):
+                        # load the content of the file as template
+                        t = Template(self._get_content_of_file(real_file_template_path))
+                        message = t.render(**message)
+                    else:
+                        raise TemplateFileNotFoundException("Template file %s not found in templates folder"
+                                                            % real_file_template_path)
+
             else:
-                raise NoTemplateException("You must specify a say_template to your Neurone for the entries ", message.keys())
+                raise NoTemplateException("You must specify a say_template or a file_template", message.keys())
+
         # here we use the tts to make jarvis talk
         # the module is imported on fly, depending on the selected tts from settings
         tts_backend = importlib.import_module("tts." + self.tts)
-        tts_backend.say(words=message, **self.tts_args)
+        tts_backend.say(words=message, **self.tts_args)
+
+    @staticmethod
+    def _check_file_exist(real_file_template):
+        return os.path.isfile(real_file_template)
+
+    @staticmethod
+    def _get_content_of_file(real_file_template_path):
+        with open(real_file_template_path, 'r') as content_file:
+            return content_file.read()

+ 4 - 2
neurons/systemdate/systemdate.py

@@ -7,11 +7,13 @@ from neurons import Neurone
 class Systemdate(Neurone):
     def __init__(self, *args , **kwargs):
         Neurone.__init__(self, **kwargs)
+
+        # get hours and minutes
         hour = time.strftime("%H")
         minute = time.strftime("%M")
 
         message = {
-            "hours":hour,
-            "minutes":minute
+            "hours": hour,
+            "minutes": minute
         }
         self.say(message, kwargs)

+ 1 - 0
neurons/systemdate/template/fr_template1.j2

@@ -0,0 +1 @@
+il est {{ hours }} heures et {{ minutes }} minutes

+ 1 - 0
neurons/systemdate/template/fr_template2.j2

@@ -0,0 +1 @@
+{{ hours }} heures et {{ minutes }} minutes précisément

+ 1 - 0
templates/fr_systemdate_template_example.j2

@@ -0,0 +1 @@
+ma montre indique {{ hours }} heures et {{ minutes }} minutes

+ 5 - 5
test.py

@@ -11,8 +11,8 @@ import logging
 from jinja2 import Template
 import time
 
-hour = time.strftime("%H")
-minute = time.strftime("%M")
-t = Template("il est {{ hour }} heures et {{ minutes }}!")
-uu= t.render(hour=hour, minutes=minute)
-print uu
+
+
+oa = OrderAnalyser("quelle heure")
+
+oa.start()