Git Product home page Git Product logo

casepro's Introduction

RapidPro

Build Status codecov

RapidPro is a platform for visually building interactive messaging applications. To learn more, please visit the project site at http://rapidpro.github.io/rapidpro.

Stable Versions

The set of versions that make up the latest stable release are:

Versioning

Major releases are made every 6 months on a set schedule. We target January as a major release (e.g. 9.0.0), then July as the stable dot release (e.g. 9.2.0). Unstable releases (i.e. development versions) have odd minor versions (e.g. 9.1.*, 9.3.*). Generally we recommend staying on stable releases.

To upgrade from one stable release to the next, you must first install and run the migrations for the latest stable release you are on, then every stable release afterwards. For example if you're upgrading from 7.4 to 8.0, you need to upgrade to 7.4.2 before upgrading to 8.0

Generally we only do bug fixes (patch releases) on stable releases for the first two weeks after we put out that release. After that you either have to wait for the next stable release or take your chances with an unstable release.

casepro's People

Contributors

codiebeulaine avatar dependabot[bot] avatar edudouglas avatar erikh360 avatar evansmurithi avatar gsvr avatar imsickofmaps avatar johncordeiro avatar jpaidoussi avatar justinvdm avatar kaitcrawford avatar megh-k avatar miltontony avatar nicpottier avatar norkans7 avatar projectmushroom avatar rowanseymour avatar rudigiesler avatar smn avatar

Stargazers

 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

casepro's Issues

Track daily counts of replies sent by different users, partners and orgs

Currently on partner dashboard we should counts of replies sent by that partner's users. These are calculated on the fly, and that works for our production instance because total number of replies is still < 100,000.

With upcoming org-level dashboard and as database grows, need to add proper tracking of these counts. We can track on a per-day basis and aggregate to generate per-month charts.

From our experience with RapidPro, the most reliable way to track counts and avoid database deadlocks is to use an insert/squash pattern. As new items are created, they insert a count into a table, and a background process is responsible for squashing those into daily totals.

Partners should have group based access permisions

Currently in Uganda one of the needs is put access restriction on some of the partners. Here a partners can monitor the same label but only for Ureporters in a specific group.

The whole point behind this is to have partners focus on messages from only specific regions(districts).

Dashboard tabs should be linkable to

Should be able to link to a tab like "Users" on the "Organization" dashboard, e.g. /org/home/#?tab=users. Having tab changes change the URL would also mean that going back to a dashboard would take the user back to the tab they were previously on.

Change anon contact identifiers to be pk based

Currently in the case of anonymous UPartners orgs we use the last 6-digits of a contact UUID to generate an identifier to be displayed in place of their name. However this isn't guaranteed to be unique. Might be better to zero pad database ids, e.g. 00012345.

Forwards should use one outgoing message per URN

Right now the outgoing model supports multiple URNs (because it used to represent a RapidPro broadcast). Should switch it to be a single URN, so easier to make meaningful counts of forwards, same has how it was switched to be one per contact for replies.

The UI only allows a single URN for a forward, so all outgoing instance which are forwards should be single URN anyway.

Frontend code should use local model pks rather than backend ids

A holdover from the days when CasePro was a realtime view of data in RapidPro - some things are still referenced by their backend identifier in the front end code, e.g. messages, groups. These should all be switched to local primary key, as objects may be local only in some deployments.

Redirect on deleting a label

This PR #136 addressed the incorrect redirect when creating a label. It seems that we have the same issue when deleting a label.

When deleting the label it displays the label JSON, instead of redirecting to something sensable.

Add users as case watchers on existing cases

Recent change to add case activity notifications (#69) didn't add watchers to existing cases, so users won't start getting notifications unless they interact with a case. Better if we use a migration to add users as watchers on existing cases if they've previously interacted with that case.

Don't let users bulk reply to case messages

Case messages (any incoming message that belongs to a case) can be replied to using the regular bulk reply functionality from the inbox view - but seems like that is undesirable and replies to cases should always be made from within the case so that users see complete context.

jQuery import errors on login page

I've not been able to replicate this but have seen in Sentry errors like "$ is not defined" on the login page. Always Chrome and always Windows.

Automatic synchronization

I am running the command: python manage.py celery worker -A casepro -B, but the automatic synchronization of the data not working, only work when I run pullmessages or pullcontacts command. What the celery command I need to execute to work correctly?

Don't delete users - just remove them from orgs

Currently users are deactivated when deleted (is_active => False) - which is then a problem if someone wants to add the same user (i.e. same email) again. Instead they should just be removed from org groups.

Existing inactive users could be re-activated as long as they are removed from all org groups.

'manage.py migrate' fails with "ImportError: cannot import name get_cache"

Traceback (most recent call last):
File "manage.py", line 8, in
execute_from_command_line(sys.argv)
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django/core/management/init.py", line 353, in execute_from_command_line
utility.execute()
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django/core/management/init.py", line 327, in execute
django.setup()
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django/init.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django/apps/config.py", line 123, in create
import_module(entry)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/init.py", line 37, in import_module
import(name)
File "/Users/richard/Dropbox/Code/casepro/casepro/casepro/orgs_ext/init.py", line 5, in
from dash.orgs.models import Org
File "/Users/richard/Dropbox/Code/casepro/casepro/env/src/dash-master/dash/orgs/models.py", line 7, in
from dash.api import API
File "/Users/richard/Dropbox/Code/casepro/casepro/env/src/dash-master/dash/api/init.py", line 12, in
from redis_cache import get_redis_connection
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/redis_cache/init.py", line 1, in
from django_redis import get_redis_connection
File "/Users/richard/Dropbox/Code/casepro/casepro/env/lib/python2.7/site-packages/django_redis/init.py", line 3, in
from django.core.cache import get_cache
ImportError: cannot import name get_cache

Simplify contact reference displaying

Currently a reference to contact is displayed using a bit of angular to get the first 6 letters of their UUID, e.g.

screen shot 2016-05-24 at 13 11 03

This is a holdover from back when we didn't have any other contact information to display. The UPartners deployment will continue to render contacts like this, but to make things less UPartner specific I suggest we use the name field of the contact, and in the UPartners case, this will be set on the model to the shortened UUID when synchronising contacts.

Creating a label that is not yet on Rapidpro throws TypeError: create_label() takes exactly 3 arguments (2 given)

Traceback:
File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response

  1.                 response = wrapped_callback(request, _callback_args, *_callback_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/utils/decorators.py" in inner
  2.                 return func(_args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  3.         return self.dispatch(request, _args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/src/smartmin/smartmin/views.py" in dispatch
  4.     return wrapper(request, _args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/src/smartmin/smartmin/views.py" in wrapper
  5.                 return super(SmartView, self).dispatch(request, _args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  6.     return handler(request, _args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/views/generic/edit.py" in post
  7.     return super(BaseCreateView, self).post(request, _args, *_kwargs)
    
    File "/home/kenneth/.virtualenvs/casepro/local/lib/python2.7/site-packages/django/views/generic/edit.py" in post
  8.         return self.form_valid(form)
    
    File "/home/kenneth/.virtualenvs/casepro/src/smartmin/smartmin/views.py" in form_valid
  9.         self.save(self.object)
    
    File "/home/kenneth/Code/py/casepro/casepro/cases/views.py" in save
  10.         self.object = Label.create(org, name, description, words, partners)
    
    File "/home/kenneth/Code/py/casepro/casepro/cases/models.py" in create
  11.         remote = cls.get_or_create_remote(org, name)
    
    File "/home/kenneth/Code/py/casepro/casepro/cases/models.py" in get_or_create_remote
  12.         return client.create_label(name)
    

Exception Type: TypeError at /label/create/
Exception Value: create_label() takes exactly 3 arguments (2 given)

Unlabelled flow type messages should be accessible somewhere

Currently Inbox > Unlabelled only shows inbox type messages, so that that folder isn't swamped by flow type messages. However flow type messages are included in total message count, so it's confusing when these messages don't appear anywhere.

Can't edit incorrect API key

If you set an incorrect API key, you can't get back in to edit it:

Environment:


Request Method: GET
Request URL: http://testing.localhost:8000/manage/org/edit/

Django Version: 1.8
Python Version: 2.7.6
Installed Applications:
(u'django.contrib.auth',
 u'django.contrib.contenttypes',
 u'django.contrib.sessions',
 u'django.contrib.sites',
 u'django.contrib.messages',
 u'django.contrib.staticfiles',
 u'django.contrib.humanize',
 u'guardian',
 u'reversion',
 u'django.contrib.admin',
 u'compressor',
 u'sorl.thumbnail',
 u'smartmin',
 u'smartmin.csv_imports',
 u'smartmin.users',
 u'djcelery',
 u'dash.orgs',
 u'dash.utils',
 u'casepro.cases',
 u'casepro.orgs_ext',
 u'casepro.profiles',
 u'django_nose',
 u'debug_toolbar.apps.DebugToolbarConfig')
Installed Middleware:
(u'django.contrib.sessions.middleware.SessionMiddleware',
 u'django.middleware.locale.LocaleMiddleware',
 u'django.middleware.common.CommonMiddleware',
 u'django.middleware.csrf.CsrfViewMiddleware',
 u'django.contrib.auth.middleware.AuthenticationMiddleware',
 u'django.contrib.messages.middleware.MessageMiddleware',
 u'dash.orgs.middleware.SetOrgMiddleware',
 u'casepro.profiles.middleware.ForcePasswordChangeMiddleware',
 u'debug_toolbar.middleware.DebugToolbarMiddleware')


Traceback:
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/utils/decorators.py" in inner
  145.                     return func(*args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/views/generic/base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/views.py" in dispatch
  149.         return wrapper(request, *args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/views.py" in wrapper
  145.                     return super(SmartView, self).dispatch(request, *args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/views/generic/edit.py" in get
  268.         return super(BaseUpdateView, self).get(request, *args, **kwargs)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/views/generic/edit.py" in get
  205.         form = self.get_form()
File "/Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/views.py" in get_form
  859.         self.form = super(SmartFormMixin, self).get_form(form_class)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/views/generic/edit.py" in get_form
  74.         return form_class(**self.get_form_kwargs())
File "/Users/tobias/caktus/casepro/casepro/orgs_ext/views.py" in __init__
  73.                 for field in sorted(client.get_fields(), key=lambda f: f.key.lower()):
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/temba/__init__.py" in get_fields
  254.         return Field.deserialize_list(self._get_multiple('fields', {}, pager))
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/temba/base.py" in _get_multiple
  261.             return self._get_all(endpoint, params)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/temba/base.py" in _get_all
  289.             response = self._request('get', url, params=params)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/temba/base.py" in _request
  330.             raise TembaAPIError(ex)

Exception Type: TembaAPIError at /manage/org/edit/
Exception Value: API request error. Caused by: 403 Client Error: FORBIDDEN

Can't get to the user management page when logged in as a superuser

Environment:


Request Method: GET
Request URL: http://localhost:8000/user/

Django Version: 1.8
Python Version: 2.7.6
Installed Applications:
(u'django.contrib.auth',
 u'django.contrib.contenttypes',
 u'django.contrib.sessions',
 u'django.contrib.sites',
 u'django.contrib.messages',
 u'django.contrib.staticfiles',
 u'django.contrib.humanize',
 u'guardian',
 u'reversion',
 u'django.contrib.admin',
 u'compressor',
 u'sorl.thumbnail',
 u'smartmin',
 u'smartmin.csv_imports',
 u'smartmin.users',
 u'djcelery',
 u'dash.orgs',
 u'dash.utils',
 u'casepro.cases',
 u'casepro.orgs_ext',
 u'casepro.profiles',
 u'django_nose',
 u'debug_toolbar.apps.DebugToolbarConfig')
Installed Middleware:
(u'django.contrib.sessions.middleware.SessionMiddleware',
 u'django.middleware.locale.LocaleMiddleware',
 u'django.middleware.common.CommonMiddleware',
 u'django.middleware.csrf.CsrfViewMiddleware',
 u'django.contrib.auth.middleware.AuthenticationMiddleware',
 u'django.contrib.messages.middleware.MessageMiddleware',
 u'dash.orgs.middleware.SetOrgMiddleware',
 u'casepro.profiles.middleware.ForcePasswordChangeMiddleware',
 u'debug_toolbar.middleware.DebugToolbarMiddleware')


Template error:
In template /Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/templates/smartmin/list.html, error at line 52
   User has no profile.

   42 :           {% for field in fields %}



   43 :           <th class="header-{{field}} {% if view|field_orderable:field %}header {% if field == order %}{% if order_asc %}headerSortUp{% else %}headerSortDown{% endif %}{% endif %}{% endif %}" id="header-{{field}}">{% get_label field %}</th>



   44 :           {% endfor %}



   45 :         </tr>



   46 :       </thead>



   47 :       <tbody>



   48 :         {% for obj in object_list %}



   49 :         <tr class="{% cycle 'row2' 'row1' %} {% if not obj.is_active and obj|is_smartobject %}inactive{% endif %}">



   50 :           {% for field in fields %}



   51 :           <td class="value-{{field}} {% get_class field obj %}{% if field in link_fields %} clickable{% endif %}">



   52 :             {% if field in link_fields %}<a {% if pjax %}data-pjax='{{ pjax }}'{% endif %} href="{% get_field_link field obj %}">{% endif %} {% get_value obj field %} {% if field in link_fields %}</a>{% endif %}



   53 :           </td>



   54 :           {% endfor %}



   55 :         </tr>



   56 :         {% empty %}



   57 :         <tr class="empty_list">



   58 :           {% for field in fields %}



   59 :           <td></td>



   60 :           {% endfor %}



   61 :         </tr>



   62 :         {% endfor %}


Traceback:
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  164.                 response = response.render()
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/response.py" in render
  158.             self.content = self.rendered_content
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/response.py" in rendered_content
  135.         content = template.render(context, self._request)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  209.                     return self._render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  65.                 result = block.nodelist.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  903.                 bit = self.render_node(node, context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  217.                             nodelist.append(node.render(context))
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  217.                             nodelist.append(node.render(context))
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/template/base.py" in render
  1195.                     return func(*resolved_args, **resolved_kwargs)
File "/Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/templatetags/smartmin.py" in get_value
  69.     value = view.lookup_field_value(context, obj, field)
File "/Users/tobias/.virtualenvs/casepro/src/smartmin-master/smartmin/views.py" in lookup_field_value
  202.                 return view_method(obj)
File "/Users/tobias/caktus/casepro/casepro/profiles/views.py" in get_full_name
  107.         return obj.profile.full_name
File "/Users/tobias/.virtualenvs/casepro/lib/python2.7/site-packages/django/db/models/fields/related.py" in __get__
  462.                     self.related.get_accessor_name()

Exception Type: RelatedObjectDoesNotExist at /user/
Exception Value: User has no profile.

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.