)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9644ca2f_b666dd2b","updated":"2025-06-13 19:18:01.000000000","message":"so this is very much a work in progress i think i will jsut remvoe the standalone supprot.\n\nits a nice idea but its not giving much value right now","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1311fc4a_d8836035","updated":"2025-06-16 16:04:02.000000000","message":"Looking good 😊 happy to see the dashboard showing up some metrics... left a few comments/questions inline","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"MANIFEST.in":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f716c4d7_adf9e188","updated":"2025-06-15 19:04:09.000000000","message":"in theory this shoudl be generated by pbr so this shoudl not be needed.\nit was added due to an issue with the template path but i can proably remove it now","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b58acb076105b116928952b666afeb1a4641354c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a73b89d5_9d9bef96","in_reply_to":"8c29afd3_a568648f","updated":"2025-06-16 16:38:48.000000000","message":"ya so it depend on how you package the plugin\n\nthis file is one of the files that is auto genetaged by PBR for us\n\nhttps://docs.openstack.org/pbr/latest/user/features.html#\n\nif your just using setuptools directly without PBR then you need to provide this by hand.\n\nthis was added to this review as part of debuging possibel packaing issues but i need to confirm if its acutlly needed.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8c29afd3_a568648f","in_reply_to":"f716c4d7_adf9e188","updated":"2025-06-16 16:04:02.000000000","message":"as mentioned in the troubleshooting doc, I noticed this file as a recommendation in the Horizon plugin tutorial, but I haven\u0027t seen it used in other plugin implementations... maybe it is not required anymore?","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"TROUBLESHOOTING.md":[{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Troubleshooting Guide"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"## Static Files Issues in Horizon"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-markdown","patch_set":3,"id":"9a339d3a_8a396c4b","line":1,"updated":"2025-06-16 16:04:02.000000000","message":"_THANK YOU_ for making a troubleshooting guide... I was hitting maybe of this my own","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"4. **Restart development server** (if needed)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"### Template Discovery Issues"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"**Problem:** `TemplateDoesNotExist` errors"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"**Solution:**"},{"line_number":65,"context_line":"Ensure templates are in the correct location:"},{"line_number":66,"context_line":"- Templates should be in: `plugin/content/module/templates/module/template.html`"},{"line_number":67,"context_line":"- Not in a central `plugin/templates/` directory"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"**Example:**"},{"line_number":70,"context_line":"```"},{"line_number":71,"context_line":"grian_ui/"},{"line_number":72,"context_line":"  content/"},{"line_number":73,"context_line":"    hello_world/"},{"line_number":74,"context_line":"      templates/"},{"line_number":75,"context_line":"        hello_world/"},{"line_number":76,"context_line":"          index.html  ← Correct location"},{"line_number":77,"context_line":"```"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"b51e4328_57fb192a","line":76,"range":{"start_line":60,"start_character":0,"end_line":76,"end_character":40},"updated":"2025-06-15 19:04:09.000000000","message":"this is wrong. thats a pattern but this was caused because of other isseus.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"4. **Restart development server** (if needed)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"### Template Discovery Issues"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"**Problem:** `TemplateDoesNotExist` errors"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"**Solution:**"},{"line_number":65,"context_line":"Ensure templates are in the correct location:"},{"line_number":66,"context_line":"- Templates should be in: `plugin/content/module/templates/module/template.html`"},{"line_number":67,"context_line":"- Not in a central `plugin/templates/` directory"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"**Example:**"},{"line_number":70,"context_line":"```"},{"line_number":71,"context_line":"grian_ui/"},{"line_number":72,"context_line":"  content/"},{"line_number":73,"context_line":"    hello_world/"},{"line_number":74,"context_line":"      templates/"},{"line_number":75,"context_line":"        hello_world/"},{"line_number":76,"context_line":"          index.html  ← Correct location"},{"line_number":77,"context_line":"```"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"b5a76d0b_ec212ed1","line":76,"range":{"start_line":60,"start_character":0,"end_line":76,"end_character":40},"in_reply_to":"b51e4328_57fb192a","updated":"2025-06-16 16:04:02.000000000","message":"still not sure how the templates discovery works\n\nplugins like manila_ui have the dashboards separated depending on the panel_dashboard that they belong (admin, project or identity) and this adds yet another level to the directory structure","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b58acb076105b116928952b666afeb1a4641354c","unresolved":true,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"4. **Restart development server** (if needed)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"### Template Discovery Issues"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"**Problem:** `TemplateDoesNotExist` errors"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"**Solution:**"},{"line_number":65,"context_line":"Ensure templates are in the correct location:"},{"line_number":66,"context_line":"- Templates should be in: `plugin/content/module/templates/module/template.html`"},{"line_number":67,"context_line":"- Not in a central `plugin/templates/` directory"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"**Example:**"},{"line_number":70,"context_line":"```"},{"line_number":71,"context_line":"grian_ui/"},{"line_number":72,"context_line":"  content/"},{"line_number":73,"context_line":"    hello_world/"},{"line_number":74,"context_line":"      templates/"},{"line_number":75,"context_line":"        hello_world/"},{"line_number":76,"context_line":"          index.html  ← Correct location"},{"line_number":77,"context_line":"```"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"4a7b1e39_9e96a88c","line":76,"range":{"start_line":60,"start_character":0,"end_line":76,"end_character":40},"in_reply_to":"b5a76d0b_ec212ed1","updated":"2025-06-16 16:38:48.000000000","message":"it sort of depend\ndango check multipel path\n\nfor my orginal poc just had a toplevel tempeltes direcotry at the root of the python package.\n\nhttps://github.com/SeanMooney/grian-horizon-plugin/tree/master/grian_horizon_plugin/templates\n\nand i was just mirroring the folder stucture between content and templates\n\ni.e. https://github.com/SeanMooney/grian-horizon-plugin/tree/master/grian_horizon_plugin/content/metrics\n\nhad its templates in \n\nhttps://github.com/SeanMooney/grian-horizon-plugin/tree/master/grian_horizon_plugin/templates/metrics\n\nthat was partly based on https://opendev.org/openstack/watcher-dashboard/src/branch/master/watcher_dashboard\n\n\nmanilla puts them in the relevent view python module \nhttps://opendev.org/openstack/manila-ui/src/branch/master/manila_ui/dashboards/project/user_messages/templates/user_messages\n\ni orgianly had issues getting that to work\n\nhttps://opendev.org/openstack/ui-cookiecutter/ helpfully does not create a template directory at all.\n\n\nas long as we choose one pattern and follwo it it hink either is fine.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Ensure your `MANIFEST.in` includes static files:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"recursive-include src/plugin_name/templates *.html"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"4eeaff4d_21633ff2","line":81,"updated":"2025-06-15 19:04:09.000000000","message":"this is not harmful to have but it shoudl nto be required.\nwe might keep it for now but PBR shoudl do this for us.\n\nit may not be doing it becaues of how the configuration is done mainly by pyproject.toml instead of setup.cfg\n\nin the short to medioum term ther eis no harm in having the manifest file btu we can likey remvoe this down the line.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Ensure your `MANIFEST.in` includes static files:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"recursive-include src/plugin_name/templates *.html"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"61814f8a_31ba6a18","line":81,"in_reply_to":"4eeaff4d_21633ff2","updated":"2025-06-16 16:04:02.000000000","message":"I saw this mentioned on the plugin tutorial but no plugin has this in place.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b58acb076105b116928952b666afeb1a4641354c","unresolved":true,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"### Package Configuration for Static Files"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Ensure your `MANIFEST.in` includes static files:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"```"},{"line_number":84,"context_line":"recursive-include src/plugin_name/templates *.html"}],"source_content_type":"text/x-markdown","patch_set":3,"id":"a102c815_f0544dc8","line":81,"in_reply_to":"61814f8a_31ba6a18","updated":"2025-06-16 16:38:48.000000000","message":"ya the coookiecutter template does create it https://opendev.org/openstack/ui-cookiecutter/src/branch/master/%7B%7Bcookiecutter.repo_name%7D%7D/MANIFEST.in\n\nbut i didn need it for my poc https://github.com/SeanMooney/grian-horizon-plugin/tree/master\n\nso it think this is not needed anymore.\n\nthe actul problem i was trying to reolve was fix by \n\n\"\"\"\n.tox/runserver/bin/python manage.py compress --force\n.tox/runserver/bin/python manage.py collectstatic --noinput\n\"\"\"\n\nthis was one of the steps that i explcored along the way.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"src/grian_ui/apps.py":[{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[{"line_number":4,"context_line":"from django.apps import AppConfig"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"class GrianUIConfig(AppConfig):"},{"line_number":8,"context_line":"    name \u003d \"grian_ui\""},{"line_number":9,"context_line":"    label \u003d \"grian_ui\""},{"line_number":10,"context_line":"    verbose_name \u003d \"Grian UI\""}],"source_content_type":"text/x-python","patch_set":3,"id":"e41e3537_43260dc2","line":7,"updated":"2025-06-16 16:04:02.000000000","message":"I don\u0027t think this is required... is it?","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b58acb076105b116928952b666afeb1a4641354c","unresolved":true,"context_lines":[{"line_number":4,"context_line":"from django.apps import AppConfig"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"class GrianUIConfig(AppConfig):"},{"line_number":8,"context_line":"    name \u003d \"grian_ui\""},{"line_number":9,"context_line":"    label \u003d \"grian_ui\""},{"line_number":10,"context_line":"    verbose_name \u003d \"Grian UI\""}],"source_content_type":"text/x-python","patch_set":3,"id":"a723d0f3_5b18015a","line":7,"in_reply_to":"e41e3537_43260dc2","updated":"2025-06-16 16:38:48.000000000","message":"i think this was left over from v2/v1 where i was also deploying stand alone mode as well. i think this can be remvoed now.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"src/grian_ui/content/hello_world/views.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":5,"context_line":"from grian_ui.datasource import api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"class IndexView(generic.TemplateView):"},{"line_number":9,"context_line":"    template_name \u003d \"hello_world/index.html\""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    def get_context_data(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b9fb3011_bfc12d9c","line":8,"updated":"2025-06-15 19:04:09.000000000","message":"this is usign the class based view approch.\n\nthat is fine but we may want to go with function based views instead\nor a mix of both.\n\n\ni think for the api routes i defintly want to take a funciton based approch but the class based approch might make mroe sense for pages.\n\nthis si kind fo personal prefence.\n\nfunciton based views tend to be easier to understand but can have more repetitions.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b58acb076105b116928952b666afeb1a4641354c","unresolved":true,"context_lines":[{"line_number":5,"context_line":"from grian_ui.datasource import api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"class IndexView(generic.TemplateView):"},{"line_number":9,"context_line":"    template_name \u003d \"hello_world/index.html\""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    def get_context_data(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"dcca670d_a30b0fd4","line":8,"in_reply_to":"843b1e70_9ba8a656","updated":"2025-06-16 16:38:48.000000000","message":"Yes, so if we start implementing an API for HTMX or JavaScript to call, I think we should prefer FBV for that.\n\nfor the views in general i think we coudl go either way.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":6413,"name":"Victoria Martinez de la Cruz","email":"victoria@redhat.com","username":"vkmc"},"change_message_id":"442a43671f377912d27ad3fdf4df80fc2c185c0e","unresolved":true,"context_lines":[{"line_number":5,"context_line":"from grian_ui.datasource import api"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"class IndexView(generic.TemplateView):"},{"line_number":9,"context_line":"    template_name \u003d \"hello_world/index.html\""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    def get_context_data(self, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"843b1e70_9ba8a656","line":8,"in_reply_to":"b9fb3011_bfc12d9c","updated":"2025-06-16 16:04:02.000000000","message":"for what I understand, functions based view (FBV) is better when we only need to return a template/json and class based view (CBV) is more convenient when we need to split the logic across HTTP methods, or we have CRUD operations, or we need to reuse other components\n\nmostly in Horizon I saw CBV, but we can make our own choices here\n\nin this case we are only getting and displaying data, so we could get away with FBV","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"src/grian_ui/datasource/api.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":9,"context_line":"from django.conf import settings"},{"line_number":10,"context_line":"from django.utils.module_loading import import_string"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"def get_datasource():"},{"line_number":14,"context_line":"    \"\"\""},{"line_number":15,"context_line":"    Get the configured datasource backend."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    Returns the datasource implementation based on GRIAN_PLUGIN[\u0027datasource\u0027]"},{"line_number":18,"context_line":"    setting. Defaults to \u0027fake\u0027 if not configured."},{"line_number":19,"context_line":"    \"\"\""},{"line_number":20,"context_line":"    plugin_config \u003d getattr(settings, \"GRIAN_PLUGIN\", {})"},{"line_number":21,"context_line":"    datasource_type \u003d plugin_config.get(\"datasource\", \"fake\")"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    module_path \u003d f\"grian_ui.datasource.{datasource_type}\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    try:"},{"line_number":26,"context_line":"        datasource_module \u003d import_string(module_path)"},{"line_number":27,"context_line":"        return datasource_module.get_client()"},{"line_number":28,"context_line":"    except ImportError:"},{"line_number":29,"context_line":"        # Fallback to fake datasource"},{"line_number":30,"context_line":"        from grian_ui.datasource.fake import get_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        return get_client()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def get_telemetry_overview():"}],"source_content_type":"text/x-python","patch_set":3,"id":"f4778c8b_9a2fc6e9","line":32,"range":{"start_line":12,"start_character":0,"end_line":32,"end_character":27},"updated":"2025-06-15 19:04:09.000000000","message":"this is not terrible i guess but at a  minium this funciton need to have functools.cache\n\nit might make sense to consider using stevador if we anted to allow people to\nadd datasouces as a plugin.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        return get_client()"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def get_telemetry_overview():"},{"line_number":36,"context_line":"    \"\"\"Get overview telemetry data.\"\"\""},{"line_number":37,"context_line":"    datasource \u003d get_datasource()"},{"line_number":38,"context_line":"    return datasource.get_overview()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def get_metrics_summary():"},{"line_number":42,"context_line":"    \"\"\"Get metrics summary data.\"\"\""},{"line_number":43,"context_line":"    datasource \u003d get_datasource()"},{"line_number":44,"context_line":"    return datasource.get_metrics_summary()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def get_recent_alerts():"},{"line_number":48,"context_line":"    \"\"\"Get recent alerts data.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"af991cea_c21842f0","line":45,"range":{"start_line":35,"start_character":0,"end_line":45,"end_character":1},"updated":"2025-06-15 19:04:09.000000000","message":"these are two generic but the show the basic pattern.","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    return datasource.get_metrics_summary()"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def get_recent_alerts():"},{"line_number":48,"context_line":"    \"\"\"Get recent alerts data.\"\"\""},{"line_number":49,"context_line":"    datasource \u003d get_datasource()"},{"line_number":50,"context_line":"    return datasource.get_recent_alerts()"}],"source_content_type":"text/x-python","patch_set":3,"id":"f4a51e6e_53ac66a8","line":50,"range":{"start_line":47,"start_character":0,"end_line":50,"end_character":41},"updated":"2025-06-15 19:04:09.000000000","message":"we will not have alert, at least not initally so ill remove this","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}],"src/grian_ui/static/hello_world/css/hello_world.css":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"/* SPDX-License-Identifier: Apache-2.0 */"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"/* Horizon-style Metrics Dashboard */"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":".quota-dynamic {"}],"source_content_type":"text/css","patch_set":2,"id":"94cdcb97_baa11d9f","line":2,"updated":"2025-06-13 19:18:01.000000000","message":"again this is just a sub for the standalone mode im not sure we want to keep this.\nits a  copy of horizons css.,","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d8893b0598755ddcc61073e9c6a865f7b50dbf4c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"/* SPDX-License-Identifier: Apache-2.0 */"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"/* Horizon-style Metrics Dashboard */"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":".quota-dynamic {"}],"source_content_type":"text/css","patch_set":2,"id":"b4ca2104_4cacfc19","line":2,"in_reply_to":"94cdcb97_baa11d9f","updated":"2025-06-13 19:32:04.000000000","message":"Done","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"}],"src/grian_ui/static/hello_world/js/horizon.d3linechart.js":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"/**"},{"line_number":2,"context_line":" * Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":" * not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":" * a copy of the License at"}],"source_content_type":"text/javascript","patch_set":2,"id":"8a4c8569_3d4e6cca","line":1,"updated":"2025-06-13 19:18:01.000000000","message":"this is a copy of the fiel form horizon it just being used currelty when we run in standalone mode.\n\nthis does thecnially work but im not sure we want to continue useing this very old d3 rickshaw grahing interface.","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d8893b0598755ddcc61073e9c6a865f7b50dbf4c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"/**"},{"line_number":2,"context_line":" * Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":" * not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":" * a copy of the License at"}],"source_content_type":"text/javascript","patch_set":2,"id":"de97f795_0d98c605","line":1,"in_reply_to":"8a4c8569_3d4e6cca","updated":"2025-06-13 19:32:04.000000000","message":"Done","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"}],"src/grian_ui/templates/base.html":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003c!DOCTYPE html\u003e"},{"line_number":2,"context_line":"\u003chtml\u003e"},{"line_number":3,"context_line":"\u003chead\u003e"},{"line_number":4,"context_line":"    \u003cmeta content\u003d\"IE\u003dedge\" http-equiv\u003d\"X-UA-Compatible\" /\u003e"}],"source_content_type":"text/html","patch_set":2,"id":"623dec67_8a7a0b1f","line":1,"updated":"2025-06-13 19:18:01.000000000","message":"this is a fallback base template for standalone mode.","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d8893b0598755ddcc61073e9c6a865f7b50dbf4c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c!DOCTYPE html\u003e"},{"line_number":2,"context_line":"\u003chtml\u003e"},{"line_number":3,"context_line":"\u003chead\u003e"},{"line_number":4,"context_line":"    \u003cmeta content\u003d\"IE\u003dedge\" http-equiv\u003d\"X-UA-Compatible\" /\u003e"}],"source_content_type":"text/html","patch_set":2,"id":"6569334b_b96331ed","line":1,"in_reply_to":"623dec67_8a7a0b1f","updated":"2025-06-13 19:32:04.000000000","message":"Done","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    \u003c!-- Bootstrap 3.x for Horizon compatibility --\u003e"},{"line_number":9,"context_line":"    \u003clink rel\u003d\"stylesheet\" href\u003d\"https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css\"\u003e"},{"line_number":10,"context_line":"    \u003c!-- Paper theme similar to Horizon --\u003e"},{"line_number":11,"context_line":"    \u003clink rel\u003d\"stylesheet\" href\u003d\"https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/paper/bootstrap.min.css\"\u003e"},{"line_number":12,"context_line":"    {% load static %}"},{"line_number":13,"context_line":"    {% block extra_css %}{% endblock %}"},{"line_number":14,"context_line":"\u003c/head\u003e"}],"source_content_type":"text/html","patch_set":2,"id":"cd45d961_10465738","line":11,"updated":"2025-06-13 19:18:01.000000000","message":"that why its use bootstrap directly for the cdn.","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d8893b0598755ddcc61073e9c6a865f7b50dbf4c","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    \u003c!-- Bootstrap 3.x for Horizon compatibility --\u003e"},{"line_number":9,"context_line":"    \u003clink rel\u003d\"stylesheet\" href\u003d\"https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css\"\u003e"},{"line_number":10,"context_line":"    \u003c!-- Paper theme similar to Horizon --\u003e"},{"line_number":11,"context_line":"    \u003clink rel\u003d\"stylesheet\" href\u003d\"https://maxcdn.bootstrapcdn.com/bootswatch/3.4.1/paper/bootstrap.min.css\"\u003e"},{"line_number":12,"context_line":"    {% load static %}"},{"line_number":13,"context_line":"    {% block extra_css %}{% endblock %}"},{"line_number":14,"context_line":"\u003c/head\u003e"}],"source_content_type":"text/html","patch_set":2,"id":"fda68fa4_bf6de772","line":11,"in_reply_to":"cd45d961_10465738","updated":"2025-06-13 19:32:04.000000000","message":"Done","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"}],"src/grian_ui/templates/hello_world/index.html":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b72ecebe87e680d70d2e434446092c183614199a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{% extends \u0027base.html\u0027 %}"},{"line_number":2,"context_line":"{% load i18n static %}"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"{% block title %}{% trans \"Hypervisor Metrics\" %} - OpenStack Dashboard{% endblock %}"}],"source_content_type":"text/html","patch_set":2,"id":"422e0996_ff3b047a","line":1,"updated":"2025-06-13 19:18:01.000000000","message":"this is the steandlaone version fo the dsahboard.\n\nit woudl be reslively trivall ot have this be almos tempty and jsut inclde 99% of the contend form a shraed partial but i think i may just remove this","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d8893b0598755ddcc61073e9c6a865f7b50dbf4c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{% extends \u0027base.html\u0027 %}"},{"line_number":2,"context_line":"{% load i18n static %}"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"{% block title %}{% trans \"Hypervisor Metrics\" %} - OpenStack Dashboard{% endblock %}"}],"source_content_type":"text/html","patch_set":2,"id":"87deb8e9_21fd40a6","line":1,"in_reply_to":"422e0996_ff3b047a","updated":"2025-06-13 19:32:04.000000000","message":"Done","commit_id":"1f586e5af406f175072b77a3aea02c7b99cee961"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27a366e76f60f303799a2978f9367a276c0e4a25","unresolved":true,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"  \u003ch2\u003e{% trans \"Cloud Summary\" %}\u003c/h2\u003e"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"  \u003c!-- CPU Utilization Chart --\u003e"},{"line_number":39,"context_line":"  \u003cdiv class\u003d\"col-sm-4 d3_quota_bar\"\u003e"},{"line_number":40,"context_line":"    \u003cdiv\u003e\u003ch3\u003e{% trans \"CPU Utilization\" %}\u003c/h3\u003e\u003c/div\u003e"},{"line_number":41,"context_line":"    \u003cdiv class\u003d\"chart-container\"\u003e"},{"line_number":42,"context_line":"      \u003cdiv id\u003d\"cpuChart\""},{"line_number":43,"context_line":"           data-chart-type\u003d\"line_chart\""},{"line_number":44,"context_line":"           data-settings\u003d\u0027{\"auto_size\": false, \"axes_x\": false, \"axes_y\": false, \"yMin\": 0, \"yMax\": 100, \"higlight_last_point\": true}\u0027"},{"line_number":45,"context_line":"           style\u003d\"height: 150px;\"\u003e"},{"line_number":46,"context_line":"      \u003c/div\u003e"},{"line_number":47,"context_line":"    \u003c/div\u003e"},{"line_number":48,"context_line":"    \u003cdiv id\u003d\"cpuLegend\" class\u003d\"chart-legend\"\u003e\u003c/div\u003e"},{"line_number":49,"context_line":"  \u003c/div\u003e"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"  \u003c!-- RAM Utilization Chart --\u003e"},{"line_number":52,"context_line":"  \u003cdiv class\u003d\"col-sm-4 d3_quota_bar\"\u003e"},{"line_number":53,"context_line":"    \u003cdiv\u003e\u003ch3\u003e{% trans \"RAM Utilization\" %}\u003c/h3\u003e\u003c/div\u003e"},{"line_number":54,"context_line":"    \u003cdiv class\u003d\"chart-container\"\u003e"},{"line_number":55,"context_line":"      \u003cdiv id\u003d\"ramChart\""},{"line_number":56,"context_line":"           data-chart-type\u003d\"line_chart\""},{"line_number":57,"context_line":"           data-settings\u003d\u0027{\"auto_size\": false, \"axes_x\": false, \"axes_y\": false, \"yMin\": 0, \"yMax\": 100, \"higlight_last_point\": true}\u0027"},{"line_number":58,"context_line":"           style\u003d\"height: 150px;\"\u003e"},{"line_number":59,"context_line":"      \u003c/div\u003e"},{"line_number":60,"context_line":"    \u003c/div\u003e"},{"line_number":61,"context_line":"    \u003cdiv id\u003d\"ramLegend\" class\u003d\"chart-legend\"\u003e\u003c/div\u003e"},{"line_number":62,"context_line":"  \u003c/div\u003e"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"  \u003c!-- Disk Utilization Chart --\u003e"},{"line_number":65,"context_line":"  \u003cdiv class\u003d\"col-sm-4 d3_quota_bar\"\u003e"},{"line_number":66,"context_line":"    \u003cdiv\u003e\u003ch3\u003e{% trans \"Disk Utilization\" %}\u003c/h3\u003e\u003c/div\u003e"},{"line_number":67,"context_line":"    \u003cdiv class\u003d\"chart-container\"\u003e"},{"line_number":68,"context_line":"      \u003cdiv id\u003d\"diskChart\""},{"line_number":69,"context_line":"           data-chart-type\u003d\"line_chart\""},{"line_number":70,"context_line":"           data-settings\u003d\u0027{\"auto_size\": false, \"axes_x\": false, \"axes_y\": false, \"yMin\": 0, \"yMax\": 100, \"higlight_last_point\": true}\u0027"},{"line_number":71,"context_line":"           style\u003d\"height: 150px;\"\u003e"},{"line_number":72,"context_line":"      \u003c/div\u003e"},{"line_number":73,"context_line":"    \u003c/div\u003e"},{"line_number":74,"context_line":"    \u003cdiv id\u003d\"diskLegend\" class\u003d\"chart-legend\"\u003e\u003c/div\u003e"},{"line_number":75,"context_line":"  \u003c/div\u003e"},{"line_number":76,"context_line":"\u003c/div\u003e"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"\u003cdiv class\u003d\"quota-dynamic clearfix\"\u003e"},{"line_number":79,"context_line":"  \u003cdiv\u003e\u003ch2\u003e{% trans \"Hypervisor Summary\" %}\u003c/h2\u003e\u003c/div\u003e"}],"source_content_type":"text/html","patch_set":3,"id":"8ab486cd_1daa0e70","line":76,"range":{"start_line":38,"start_character":1,"end_line":76,"end_character":6},"updated":"2025-06-15 19:04:09.000000000","message":"i got these workign but the kind of look ungly so im thinking for now we should just use simple progress bars and we can decided on the graphing","commit_id":"3a1fc497aee075d1c1212c4c47991f2b9d84a1ab"}]}
