Problem install OpenEDX in Ubuntu 16.04

171 views
Skip to first unread message

Cesar Augusto Palacios Alarcón

unread,
Jul 5, 2019, 8:54:29 AM7/5/19
to General Open edX discussion
Hi, 

Help, problem install OpenEDX in Ubuntu 16.04, the error log:



--------
TASK [edxapp : code sandbox | Install base sandbox requirements and create sandbox virtualenv] ***
fatal: [localhost]: FAILED! => {"changed": false, "cmd": "/edx/app/edxapp/venvs/edxapp-sandbox/bin/pip2 install -i https://pypi.python.org/simple --exists-action w -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt", "failed": true, "msg": "stdout: New python executable in /edx/app/edxapp/venvs/edxapp-sandbox/bin/python\nInstalling setuptools, pip, wheel...done.\nLooking in indexes: https://pypi.python.org/simple\nProcessing ./common/lib/calc\nProcessing ./common/lib/chem\nProcessing ./common/lib/sandbox-packages\nProcessing ./common/lib/symmath\nCollecting asn1crypto==0.24.0 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 11))\n  Downloading https://files.pythonhosted.org/packages/ea/cd/35485615f45f30a510576f1a56d1e0a7ad7bd8ab5ed7cdc600ef7cd06222/asn1crypto-0.24.0-py2.py3-none-any.whl (101kB)\nCollecting backports-abc==0.5 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 12))\n  Downloading https://files.pythonhosted.org/packages/7d/56/6f3ac1b816d0cd8994e83d0c4e55bc64567532f7dc543378bd87f81cebc7/backports_abc-0.5-py2.py3-none-any.whl\nCollecting cffi==1.11.5 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 13))\n  Downloading https://files.pythonhosted.org/packages/14/dd/3e7a1e1280e7d767bd3fa15791759c91ec19058ebe31217fe66f3e9a8c49/cffi-1.11.5-cp27-cp27mu-manylinux1_x86_64.whl (407kB)\nCollecting cryptography==2.2.2 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 14))\n  Downloading https://files.pythonhosted.org/packages/dd/c2/3a5bfefb25690725824ade71e6b65449f0a9f4b29702cce10560f786ebf6/cryptography-2.2.2-cp27-cp27mu-manylinux1_x86_64.whl (2.2MB)\nCollecting enum34==1.1.6 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 15))\n  Downloading https://files.pythonhosted.org/packages/c5/db/e56e6b4bbac7c4a06de1c50de6fe1ef3810018ae11732a50f15f62c7d050/enum34-1.1.6-py2-none-any.whl\nCollecting futures==3.2.0 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 16))\n  Downloading https://files.pythonhosted.org/packages/2d/99/b2c4e9d5a30f6471e410a146232b4118e697fa3ffc06d6a65efde84debd0/futures-3.2.0-py2-none-any.whl\nCollecting idna==2.7 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 17))\n  Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)\nCollecting ipaddress==1.0.22 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 18))\n  Downloading https://files.pythonhosted.org/packages/fc/d0/7fc3a811e011d4b388be48a0e381db8d990042df54aa4ef4599a31d39853/ipaddress-1.0.22-py2.py3-none-any.whl\nCollecting lxml==3.8.0 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 19))\n  Downloading https://files.pythonhosted.org/packages/1b/e8/ce25c547daf9b84cafea605eb8a5709524fb53e1b3bb5ef6884e561b9d34/lxml-3.8.0-cp27-cp27mu-manylinux1_x86_64.whl (6.8MB)\nCollecting matplotlib==1.3.1 (from -r /edx/app/edxapp/edx-platform/requirements/edx-sandbox/base.txt (line 20))\n  Downloading https://files.pythonhosted.org/packages/d4/d0/17f17792a4d50994397052220dbe3ac9850ecbde0297b7572933fa4a5c98/matplotlib-1.3.1.tar.gz (42.7MB)\n\n:stderr: DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.\n    ERROR: Complete output from command python setup.py egg_info:\n    ERROR: ============================================================================\n    Edit setup.cfg to change the build options\n    \n    BUILDING MATPLOTLIB\n                matplotlib: yes [1.3.1]\n                    python: yes [2.7.12 (default, Nov 12 2018, 14:36:49)  [GCC\n                            5.4.0 20160609]]\n                  platform: yes [linux2]\n    \n    REQUIRED DEPENDENCIES AND EXTENSIONS\n                     numpy: yes [not found. pip may install it below.]\n                  dateutil: yes [dateutil was not found. It is required for date\n                            axis support. pip/easy_install may attempt to\n                            install it after matplotlib.]\n                   tornado: yes [tornado was not found. It is required for the\n                            WebAgg backend. pip/easy_install may attempt to\n                            install it after matplotlib.]\n                 pyparsing: yes [pyparsing was not found. It is required for\n                            mathtext support. pip/easy_install may attempt to\n                            install it after matplotlib.]\n                     pycxx: yes [Couldn't import.  Using local copy.]\n                    libagg: yes [pkg-config information for 'libagg' could not\n                            be found. Using local copy.]\n                  freetype: yes [version 18.1.12]\n                       png: yes [version 1.2.54]\n    \n    OPTIONAL SUBPACKAGES\n               sample_data: yes [installing]\n                  toolkits: yes [installing]\n                     tests: yes [nose 0.11.1 or later is required to run the\n                            matplotlib test suite]\n    \n    OPTIONAL BACKEND EXTENSIONS\n                    macosx: no  [Mac OS-X only]\n                    qt4agg: no  [PyQt4 not found]\n                   gtk3agg: no  [Requires pygobject to be installed.]\n                 gtk3cairo: no  [Requires cairo to be installed.]\n                    gtkagg: no  [Requires pygtk]\n                     tkagg: no  [TKAgg requires Tkinter.]\n                     wxagg: no  [requires wxPython]\n                       gtk: no  [Requires pygtk]\n                       agg: yes [installing]\n                     cairo: no  [cairo not found]\n                 windowing: no  [Microsoft Windows only]\n    \n    OPTIONAL LATEX DEPENDENCIES\n                    dvipng: no\n               ghostscript: no\n                     latex: no\n                   pdftops: no\n    \n    Traceback (most recent call last):\n      File \"<string>\", line 1, in <module>\n      File \"/tmp/pip-install-GKx0hD/matplotlib/setup.py\", line 268, in <module>\n        **extra_args\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/__init__.py\", line 144, in setup\n        _install_setup_requires(attrs)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/__init__.py\", line 139, in _install_setup_requires\n        dist.fetch_build_eggs(dist.setup_requires)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/dist.py\", line 717, in fetch_build_eggs\n        replace_conflicting=True,\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/pkg_resources/__init__.py\", line 782, in resolve\n        replace_conflicting=replace_conflicting\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/pkg_resources/__init__.py\", line 1065, in best_match\n        return self.obtain(req, installer)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/pkg_resources/__init__.py\", line 1077, in obtain\n        return installer(requirement)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/dist.py\", line 784, in fetch_build_egg\n        return cmd.easy_install(req)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/command/easy_install.py\", line 679, in easy_install\n        return self.install_item(spec, dist.location, tmpdir, deps)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/command/easy_install.py\", line 705, in install_item\n        dists = self.install_eggs(spec, download, tmpdir)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/command/easy_install.py\", line 890, in install_eggs\n        return self.build_and_install(setup_script, setup_base)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/command/easy_install.py\", line 1158, in build_and_install\n        self.run_setup(setup_script, setup_base, args)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/command/easy_install.py\", line 1144, in run_setup\n        run_setup(setup_script, args)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 253, in run_setup\n        raise\n      File \"/usr/lib/python2.7/contextlib.py\", line 35, in __exit__\n        self.gen.throw(type, value, traceback)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 195, in setup_context\n        yield\n      File \"/usr/lib/python2.7/contextlib.py\", line 35, in __exit__\n        self.gen.throw(type, value, traceback)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 166, in save_modules\n        saved_exc.resume()\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 141, in resume\n        six.reraise(type, exc, self._tb)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 154, in save_modules\n        yield saved\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 195, in setup_context\n        yield\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 250, in run_setup\n        _execfile(setup_script, ns)\n      File \"/edx/app/edxapp/venvs/edxapp-sandbox/local/lib/python2.7/site-packages/setuptools/sandbox.py\", line 45, in _execfile\n        exec(code, globals, locals)\n      File \"/tmp/easy_install-9UZOQO/numpy-1.17.0rc1/setup.py\", line 31, in <module>\n        try:\n    RuntimeError: Python version >= 3.5 required.\n    ----------------------------------------\nERROR: Command \"python setup.py egg_info\" failed with error code 1 in /tmp/pip-install-GKx0hD/matplotlib/\n"}
        to retry, use: --limit @/var/tmp/configuration/playbooks/edx_sandbox.retry


------

agradezco la ayuda para instalar ironwood o hawthorn, 




Ned Batchelder

unread,
Jul 5, 2019, 8:59:29 AM7/5/19
to edx-...@googlegroups.com
You didn't say what version you were installing.  Using open-release/ironwood.master should work, there was a fix merged on July 2 for this problem.

--Ned.

--
You received this message because you are subscribed to the Google Groups "General Open edX discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to edx-code+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/edx-code/24ac19e0-9927-4c96-83e0-6bc747a00237%40googlegroups.com.

Cesar Augusto Palacios Alarcón

unread,
Jul 5, 2019, 9:46:02 AM7/5/19
to edx-...@googlegroups.com
Yes, my problem present in process install  open-release/ironwood.2 and try install open-release/hawthorn.2 and present the error also

be about to check install open-release/ironwood.1




--

​​
Cordialmente,


César Augusto Palacios Alarcón
Administrador de Sistemas Informáticos
Universidad Nacional de Colombia

Matricula Profesional: 17105-042058 CLD
Tel (57)-321-798-2082



AVISO DE CONFIDENCIALIDAD: 
Este correo electrónico, incluyendo los archivos adjuntos al mismo, puede contener información de carácter confidencial y/o privilegiada, y se envía exclusivamente a la persona y/o entidad a quien va dirigido. La copia, revisión, uso, revelación y/o distribución de dicha información confidencial sin la autorización por escrito del titular de esta cuenta de correo, está prohibida. Si usted no es el destinatario a quien se dirige el presente correo, favor contactar al remitente respondiendo el presente correo y eliminar el correo original incluyendo sus archivos, así como cualquier copia del mismo. Mediante la recepción del presente correo usted reconoce y acepta que en caso de incumplimiento de su parte y/o de sus representantes a los términos antes mencionados, el titular de esta cuenta tendrá derecho a los daños y perjuicios que este le cause.

---------------

No imprima este correo a menos que sea absolutamente necesario.

El medio ambiente es responsabilidad de todos.

Kris Bhojwani

unread,
Jul 6, 2019, 8:00:45 AM7/6/19
to edx-...@googlegroups.com
To solve this issue you need to enter the following commands

sudo apt-get install python3-pip

pip3 install --user numpy==1.16

pip3 install --user matplotlib

Cesar Augusto Palacios Alarcón

unread,
Jul 8, 2019, 10:19:32 AM7/8/19
to edx-...@googlegroups.com
hi, Solved install a open-release/ironwood.master 

Şükrü Kocakaya

unread,
Jul 10, 2019, 2:35:39 AM7/10/19
to General Open edX discussion
Hİ Cesar,

I'm also experiencing the same problem during native install of Ironwood.2. How did you solve it ?

Thank in Advance

Cesar Augusto Palacios Alarcón

unread,
Jul 10, 2019, 11:44:41 AM7/10/19
to edx-...@googlegroups.com
hi, solved replaced install ironwood.2 by master.

the steps in Ubuntu 16.04:

$ sudo apt-get update -y
$ sudo apt-get upgrade -y

$ sudo reboot

- login superuser

# export OPENEDX_RELEASE=open-release/ironwood.master

- create config.yml

# nano config.yml

- and paste
-----------
# The host names of LMS and Studio. Don't include the "https://" part:

EDXAPP_LMS_BASE: "your link lms"
EDXAPP_CMS_BASE: "studio.your.link"
----

# wget https://raw.githubusercontent.com/edx/configuration/$OPENEDX_RELEASE/util/install/ansible-bootstrap.sh -O - | sudo bash
# wget https://raw.githubusercontent.com/edx/configuration/$OPENEDX_RELEASE/util/install/generate-passwords.sh -O - | bash
# wget https://raw.githubusercontent.com/edx/configuration/$OPENEDX_RELEASE/util/install/native.sh -O - | bash

review in your link access 




--
You received this message because you are subscribed to the Google Groups "General Open edX discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to edx-code+u...@googlegroups.com.

Şükrü Kocakaya

unread,
Jul 10, 2019, 3:39:06 PM7/10/19
to General Open edX discussion
Thanks Cesar

Great, but nothing has changed with Ironwood.master.

I have configured hawtorn.2 exactly the same, it is OK. But Ironwood.1 , Ironwood.2 and  Ironwood.master all gave the error "Failed to publish commerce data for course-v1:edX+DemoX+Demo_Course to LMS." . I'm really stuck :)
To unsubscribe from this group and stop receiving emails from it, send an email to edx-...@googlegroups.com.

Cesar Augusto Palacios Alarcón

unread,
Jul 10, 2019, 3:44:20 PM7/10/19
to edx-...@googlegroups.com
okay,

what is your configuration the machine example:

- Memory RAM
- Sockets process
- storage

and

system operative using


To unsubscribe from this group and stop receiving emails from it, send an email to edx-code+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/edx-code/0072e76e-c970-42b7-b837-7da04d607918%40googlegroups.com.

Şükrü Kocakaya

unread,
Jul 10, 2019, 3:57:47 PM7/10/19
to General Open edX discussion
Hi Cesar,

Virtual Box Host with :
Ubuntu 16.04
8.5GB RAM
1 vCPU
24GB Disk


It seems that although ecommerce site is registered as a trusted client , LMS OAUTH2 still checks for JWT . When ecommerce throws the exception "Error! Failed to publish commerce data for course-v1:edX+DemoX+Demo_Course to LMS.",   LMS throws (which should be called by ecommerce for course update)  "ValueError: No JSON object could be decoded"

LMS trace is the following :


Jul  9 00:10:57 edx-Iron1 [service_variant=lms][django.
request][env:sandbox] ERROR [edx-Iron1  2424] [exception.py:135] - Internal Server Error: /api/commerce/v1/courses/course-v1:edX+DemoX+Demo_Course/

Traceback (most recent call last):
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/utils/decorators.py", line 185, in inner
    return func(*args, **kwargs)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/views.py", line 489, in dispatch
    response = self.handle_exception(exc)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/views.py", line 449, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/views.py", line 477, in dispatch
    self.initial(request, *args, **kwargs)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/views.py", line 394, in initial
    self.perform_authentication(request)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/views.py", line 320, in perform_authentication
    request.user
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/request.py", line 378, in __getattribute__
    return super(Request, self).__getattribute__(attr)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/request.py", line 196, in user
    self._authenticate()
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework/request.py", line 342, in _authenticate
    user_auth_tuple = authenticator.authenticate(self)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/edx_rest_framework_extensions/auth/jwt/authentication.py", line 47, in authenticate
    return super(JwtAuthentication, self).authenticate(request)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/rest_framework_jwt/authentication.py", line 33, in authenticate
    payload = jwt_decode_handler(jwt_value)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/edx_rest_framework_extensions/auth/jwt/decoder.py", line 57, in jwt_decode_handler
    _verify_jwt_signature(token, jwt_issuer)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/edx_rest_framework_extensions/auth/jwt/decoder.py", line 137, in _verify_jwt_signature
    key_set = _get_signing_jwk_key_set(jwt_issuer)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/edx_rest_framework_extensions/auth/jwt/decoder.py", line 189, in _get_signing_jwk_key_set
    key_set.load_jwks(signing_jwk_set)
  File "/edx/app/edxapp/venvs/edxapp/local/lib/python2.7/site-packages/jwkest/jwk.py", line 776, in load_jwks
    self.load_dict(json.loads(jwks))
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Cesar Augusto Palacios Alarcón

unread,
Jul 10, 2019, 4:14:04 PM7/10/19
to edx-...@googlegroups.com
okay, 

the error is in deployment the demo course.

if execute.

- /edx/bin/supervisorctl status

running service or not running

try the configuration:


Virtual Box Host with :
Ubuntu 16.04
8 GB RAM
2 vCPU
50 GB Disk
and swap 4 GB

for install open-release/ironwood.master

--
You received this message because you are subscribed to the Google Groups "General Open edX discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to edx-code+u...@googlegroups.com.

Şükrü Kocakaya

unread,
Jul 10, 2019, 4:26:00 PM7/10/19
to General Open edX discussion
Hi Cesar,

I've found the cause of error :  "JWT_PUBLIC_SIGNING_JWK_SET" parameter .

Originally,  in ecommerce.yml file the value of  JWT_PUBLIC_SIGNING_JWK_SET is set to "null" but lms:env.json it is set to "None".

In lms:env.json  I've set  "JWT_PUBLIC_SIGNING_JWK_SET": null .

Now I can able to create and update a course on ecommerce . I don't know the technical background (just an assumption) i think "None" passes an empty key/token and therefore lms gives an error ValueError("No JSON object could be decoded").

Thank you for your help.

On Wednesday, July 10, 2019 at 11:14:04 PM UTC+3, Cesar Augusto Palacios Alarcón wrote:
okay, 

the error is in deployment the demo course.

if execute.

- /edx/bin/supervisorctl status

running service or not running

try the configuration:

Virtual Box Host with :
Ubuntu 16.04
8 GB RAM
2 vCPU
50 GB Disk
and swap 4 GB

for install open-release/ironwood.master
To unsubscribe from this group and stop receiving emails from it, send an email to edx-...@googlegroups.com.

Cesar Augusto Palacios Alarcón

unread,
Jul 10, 2019, 4:31:21 PM7/10/19
to edx-...@googlegroups.com
congrats problem resolv,

i'm thankful for share solution

Good code.

To unsubscribe from this group and stop receiving emails from it, send an email to edx-code+u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/edx-code/825f87c8-3083-4e59-8adb-cf61c0947f49%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages