Code Monkey home page Code Monkey logo

scrummer's Introduction

Build Status codecov

Scrummer

This project aims to extend Odoo with agile project management methodologies like:

  • Scrum
  • Kanban
  • Scrumban
  • Lean
  • ...

as well as to introduce a completely fresh UI framework for agile project management.

Available addons

addon version summary
scrummer 11.0.1.0.0 Base module for development of all scrummer components.
scrummer_git 11.0.1.0.0 Module which brings integration with project_git module.
scrummer_kanban 11.0.1.0.0 Module which brings integration with project_agile_kanban module.
scrummer_scrum 11.0.1.0.0 Module which brings integration with project_agile_scrum module.
scrummer_timesheet_category 11.0.1.0.0 Module which brings integration with project_timesheet_category module.
scrummer_workflow_security 11.0.1.0.0 Module which brings integration with project_workflow_security module.
scrummer_workflow_transition_by_project 11.0.1.0.0 Module which brings integration with project_workflow_transition_by_project module.
scrummer_workflow_transitions_by_task_type 11.0.1.0.0 Module which brings integration with project_agile_workflow_transitions_by_task_type module.
project_agile 11.0.1.0.0 Base module for development of all agile methodologies.
project_agile_analytic 11.0.1.0.0 Module which bring simple analytics for project tasks.
project_agile_jira 11.0.1.0.0 Module which brings interface for migration from JIRA to Odoo. Very light.
project_agile_kanban 11.0.1.0.0 Module which brings agile kanban methodology.
project_agile_scrum 11.0.1.0.0 Module which brings agile scrum methodology
project_agile_timesheet_category 11.0.1.0.0 Module which integrates project_timesheet_category with project_agile
project_agile_workflow_transitions_by_task_type 11.0.1.0.0 Module which integrates project_workflow_transitions_by_task_type with project agile.
project_git 11.0.1.0.0 Base module for development of other modules which will bring integration with specific git services like: GitHub, BitBucket, GitLab, etc.
project_git_bitbucket 11.0.1.0.0 Module which extends project_git module with BitBucket integration.
project_git_github 11.0.1.0.0 Module which extends project_git module with GitHub integration.
project_git_gitlab 11.0.1.0.0 Module which extends project_git module with GitLab integration.
project_key 11.0.1.0.0 Module which brings functionality to uniquely identify projects and tasks by simple auto generated key field.
project_timesheet_category 11.0.1.0.0 Module which brings categorization to the project timesheet.
project_workflow_management 11.0.1.0.0 This module provides functionality to create fully configurable workflow around project.task
project_workflow_action 11.0.1.0.0 This module provides functionality to execute server actions when executing task workflow.
project_workflow_default_state_per_group 11.0.1.0.0 This module provides functionality to assign different initial state to task depending on the security group.
project_workflow_security 11.0.1.0.0 Module which extends project_workflow_management to provide allowed security groups for workflow transitions.
project_workflow_transitions_by_project 11.0.1.0.0 Module which extends project_workflow_management to provide project constraints for workflow transitions.
web_diagram_position 11.0.1.0.0 Module provides functionality to save workflow elements coordinates.
web_ir_actions_act_multi 11.0.1.0.0 Module which brings new type of action to ActionManager which can execute provided list of actions.
web_ir_actions_act_view_reload 11.0.1.0.0 Module which brings new type of action to ActionManager which can reload currently active view only.
web_syncer 11.0.1.0.0 Module which provides generic interface to receive CUD model notifications on web client side.
web_widget_image_url 11.0.1.0.0 Module which provides web widget for displaying image from an URL.

Roadmap

Roadmap for further development can be found here.

Credits

Contributors

Maintainer

Modoolar logo

This repository is maintained by Modoolar.

As Odoo Gold partner, our company is specialized in Odoo ERP customization and business solutions development. Beside that, we build cool apps on top of Odoo platform.

To contribute to this module, please visit https://modoolar.com

scrummer's People

Contributors

agajic-modoolar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scrummer's Issues

12.0 or 13.0 Migration

Hello,

Have you planned to migrate these modules to 12.0 or 13.0 (when it's available)?

Kind Regards

Cannot Map States to Project Board

Hello,

I'm interest & trying to install this modules on Odoo 11 CE.
I have an issue to add item at workflow states to Project Board.

Error:
Odoo Server Error

Traceback (most recent call last):
File "/opt/odoo/server/odoo/fields.py", line 937, in get
value = record.env.cache.get(record, self)
File "/opt/odoo/server/odoo/api.py", line 960, in get
value = self._data[field][record.id][key]
KeyError: <odoo.addons.web_syncer.api.SyncerEnvironment object at 0x7f7a2c459160>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/opt/odoo/server/odoo/http.py", line 650, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/opt/odoo/server/odoo/http.py", line 310, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/opt/odoo/server/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/opt/odoo/server/odoo/http.py", line 692, in dispatch
result = self._call_function(**self.params)
File "/opt/odoo/server/odoo/http.py", line 342, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/opt/odoo/server/odoo/service/model.py", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "/opt/odoo/server/odoo/http.py", line 335, in checked_call
result = self.endpoint(*a, **kw)
File "/opt/odoo/server/addons-custom/modoolar/web/web_syncer/http.py", line 9, in call
result = self.method(*args, **kw)
File "/opt/odoo/server/odoo/http.py", line 515, in response_wrap
response = f(*args, **kw)
File "/opt/odoo/server/addons/web/controllers/main.py", line 934, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/opt/odoo/server/addons/web/controllers/main.py", line 926, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/opt/odoo/server/odoo/api.py", line 689, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/opt/odoo/server/odoo/api.py", line 680, in call_kw_multi
result = method(recs, *args, **kwargs)
File "/opt/odoo/server/odoo/models.py", line 2601, in read
values[name] = field.convert_to_read(record[name], record, use_name_get)
File "/opt/odoo/server/odoo/models.py", line 4758, in getitem
return self._fields[key].get(self, type(self))
File "/opt/odoo/server/odoo/fields.py", line 941, in get
self.determine_value(record)
File "/opt/odoo/server/odoo/fields.py", line 1052, in determine_value
self.compute_value(recs)
File "/opt/odoo/server/odoo/fields.py", line 1008, in compute_value
self._compute_value(records)
File "/opt/odoo/server/odoo/fields.py", line 999, in _compute_value
getattr(records, self.compute)()
File "/opt/odoo/server/addons-custom/modoolar/project-agile/project_agile/models/project_agile_board.py", line 372, in _compute_workflow_ids
"project_ids.workflow_id"
File "/opt/odoo/server/odoo/models.py", line 4512, in mapped
recs = recs._mapped_func(operator.itemgetter(name))
File "/opt/odoo/server/odoo/models.py", line 4491, in _mapped_func
vals = [func(rec) for rec in self]
File "/opt/odoo/server/odoo/models.py", line 4491, in
vals = [func(rec) for rec in self]
File "/opt/odoo/server/odoo/models.py", line 4758, in getitem
return self._fields[key].get(self, type(self))
KeyError: 'project_ids'

Could you help me to resolve this issue?

Regards

Error on Installation [object with reference: type_id - type.id]

I get the following error on installing the module on Odoo Enterprise V11 hosted on .sh

The operation cannot be completed, probably due to the following:
-deletion: you may be trying to delete a record while other records still reference it
-creation/update: a mandatory field is not correctly set

[object with reference: type_id - type.id]

Error on installation.

Hello. Looking forward to test this modules for our organization.

Running this docker image: https://github.com/minhng92/odoo-11-docker-compose

Have this error currently. Any help appreciated.

`Error:
Odoo Server Error

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/models.py", line 967, in _validate_fields
check(self)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 333, in check_xml
view_def = view.read_combined(['arch'])
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 717, in read_combined
arch = self.apply_view_inheritance(arch_tree, root.id, self.model)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 666, in apply_view_inheritance
source = self.apply_inheritance_specs(source, specs_tree, view_id)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 644, in apply_inheritance_specs
self.raise_view_error(
("Element '%s' cannot be located in parent view") % tag, inherit_id)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 506, in raise_view_error
raise ValueError(message)
ValueError: Element '' cannot be located in parent view

Error context:
View project.project.kanban
[view_id: 613, xml_id: n/a, model: project.project, parent_id: 382]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 741, in parse
self._tags[rec.tag](rec, de, mode=mode)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 651, in _tag_record
id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_model.py", line 1469, in _update
record = record.create(values)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 401, in create
return super(View, self).create(self._compute_defaults(values))
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 127, in create
new = super(Base, self).create(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3286, in create
self._fields[key].determine_inverse(record)
File "/usr/lib/python3/dist-packages/odoo/fields.py", line 1081, in determine_inverse
getattr(records, self.inverse)()
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 269, in _inverse_arch
view.write(data)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 417, in write
return super(View, self).write(self._compute_defaults(vals))
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 106, in write
return super(Base, self).write(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3008, in write
self._write(old_vals)
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 93, in _write
return super(Base, self)._write(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3161, in _write
self._validate_fields(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 971, in validate_fields
raise ValidationError("%s\n\n%s" % (
("Error while validating constraint"), tools.ustr(e)))
odoo.exceptions.ValidationError: ('Error while validating constraint\n\nElement '' cannot be located in parent view\n\nError context:\nView project.project.kanban\n[view_id: 613, xml_id: n/a, model: project.project, parent_id: 382]', None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 646, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 307, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/http.py", line 683, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 339, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 332, in checked_call
result = self.endpoint(*a, **kw)
File "/mnt/extra-addons/web_syncer/http.py", line 9, in call
result = self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 512, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 934, in call_button
action = self._call_kw(model, method, args, {})
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 922, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 689, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 680, in call_kw_multi
result = method(recs, *args, **kwargs)
File "", line 2, in button_immediate_install
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/module.py", line 71, in check_and_log
return method(self, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/module.py", line 448, in button_immediate_install
return self._button_immediate_function(type(self).button_install)
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/module.py", line 541, in _button_immediate_function
modules.registry.Registry.new(self._cr.dbname, update_module=True)
File "/usr/lib/python3/dist-packages/odoo/modules/registry.py", line 85, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 343, in load_modules
loaded_modules, update_module)
File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 242, in load_marked_modules
loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 156, in load_module_graph
_load_data(cr, module_name, idref, mode, kind='data')
File "/usr/lib/python3/dist-packages/odoo/modules/loading.py", line 94, in _load_data
tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 788, in convert_file
convert_xml_import(cr, module, fp, idref, mode, noupdate, report)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 849, in convert_xml_import
obj.parse(doc.getroot(), mode=mode)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 748, in parse
exc_info[2]
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 86, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 741, in parse
self._tags[rec.tag](rec, de, mode=mode)
File "/usr/lib/python3/dist-packages/odoo/tools/convert.py", line 651, in _tag_record
id = self.env(context=rec_context)['ir.model.data']._update(rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_model.py", line 1469, in _update
record = record.create(values)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 401, in create
return super(View, self).create(self._compute_defaults(values))
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 127, in create
new = super(Base, self).create(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3286, in create
self._fields[key].determine_inverse(record)
File "/usr/lib/python3/dist-packages/odoo/fields.py", line 1081, in determine_inverse
getattr(records, self.inverse)()
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 269, in _inverse_arch
view.write(data)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 417, in write
return super(View, self).write(self._compute_defaults(vals))
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 106, in write
return super(Base, self).write(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3008, in write
self._write(old_vals)
File "/mnt/extra-addons/web_syncer/models/syncer.py", line 93, in _write
return super(Base, self)._write(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 3161, in _write
self._validate_fields(vals)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 971, in validate_fields
raise ValidationError("%s\n\n%s" % (
("Error while validating constraint"), tools.ustr(e)))
odoo.tools.convert.ParseError: "Error while validating constraint

Element '' cannot be located in parent view

Error context:
View project.project.kanban
[view_id: 613, xml_id: n/a, model: project.project, parent_id: 382]
None" while parsing /mnt/extra-addons/project_agile/views/project_project_views.xml:191, near

project.project.kanban
project.project





        <xpath expr="//div[hasclass('o_primary')]/span[1]" position="after">
            <span t-if="record.type_id.value">
                <t t-esc="record.type_id.value"/>
            </span>

        </xpath>


        <xpath expr="//div[hasclass('o_kanban_manage_reports')]/div[2]" position="before">
            <div>
                <a name="open_epics" type="object">Epics</a>
            </div>
            <div>
                <a name="open_user_stories" type="object">User Stories</a>
            </div>

        </xpath>

        <xpath expr="//a[text()='Tasks']" position="attributes">
            <attribute name="name">open_tasks</attribute>
            <attribute name="type">object</attribute>
        </xpath>

        <xpath expr="//t[@t-esc='record.task_count.value']/../../.." position="attributes">
            <attribute name="name">open_tasks</attribute>
            <attribute name="type">object</attribute>
        </xpath>

        <xpath expr="//button[@t-if='record.task_needaction_count.raw_value']" position="attributes">
            <attribute name="name">open_tasks</attribute>
            <attribute name="type">object</attribute>
        </xpath>
    </data></field>
</record>`

Question: Is the the project is not updated with latest changes ?

Hello,

I was just trying to test this awesome project management tool built on Odoo and I faced some errors at installation step.

I also see that the latest commit date from 3 months ago so is the project still maintained by Modoolar and we should expect updates and fixes in the future ? or what is the plan for the project ?

Could we work on fixing issues and propose pull requests that will be reviewed and eventually merged ?

Thank you.

v11 CE

Greetings,

Any plans of having this module working on CE? It is looking for web assets of EE (web_enterprise).

Cheers!

Broken Project after install Scrummer

After Scrummer install
When try to enter Projects
got
Odoo Server Error

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 650, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 310, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 87, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/http.py", line 692, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 342, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 335, in checked_call
result = self.endpoint(*a, **kw)
File "/mnt/extra-addons/web_syncer/http.py", line 9, in call
result = self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 515, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 931, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 923, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 687, in call_kw
return call_kw_model(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 672, in call_kw_model
result = method(recs, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1295, in load_views
for [v_id, v_type] in views
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1295, in
for [v_id, v_type] in views
File "/usr/lib/python3/dist-packages/odoo/addons/mail/models/mail_thread.py", line 370, in fields_view_get
res = super(MailThread, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1374, in fields_view_get
result = self._fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
File "/usr/lib/python3/dist-packages/odoo/models.py", line 1337, in fields_view_get
root_view = View.browse(view_id).read_combined(['id', 'name', 'field_parent', 'type', 'model', 'arch'])
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 720, in read_combined
arch = self.apply_view_inheritance(arch_tree, root.id, self.model)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 669, in apply_view_inheritance
source = self.apply_inheritance_specs(source, specs_tree, view_id)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 647, in apply_inheritance_specs
self.raise_view_error(
("Element '%s' cannot be located in parent view") % tag, inherit_id)
File "/usr/lib/python3/dist-packages/odoo/addons/base/ir/ir_ui_view.py", line 509, in raise_view_error
raise ValueError(message)
ValueError: Элемент '' не может находится в родительском виде

Ошибка контекста:
Просмотр project.project.kanban
[view_id: 1254, xml_id: project_agile.view_project_kanban, model: project.project, parent_id: 384]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.